MySQL:如何获取数据库、表或列的字符集?

788

以下是:

  • MySQL 数据库的 (默认) 字符集

  • MySQL 表的 (默认) 字符集

  • MySQL 列的 (默认) 字符集


2
对于表和列,只需使用 SHOW CREATE TABLE,如 https://stackoverflow.com/questions/57628217/how-can-i-figure-out-the-default-charset-collation-in-my-mysql 中所讨论的那样。 - Rick James
17个回答

913
这是我会这样做的方式 -
对于模式(或数据库 - 他们是同义词):
SELECT default_character_set_name FROM information_schema.SCHEMATA 
WHERE schema_name = "mydatabasename";

关于表格:

SELECT CCSA.character_set_name FROM information_schema.`TABLES` T,
       information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA
WHERE CCSA.collation_name = T.table_collation
  AND T.table_schema = "mydatabasename"
  AND T.table_name = "tablename";

对于列:

SELECT character_set_name FROM information_schema.`COLUMNS` 
WHERE table_schema = "mydatabasename"
  AND table_name = "tablename"
  AND column_name = "columnname";

4
需要注意的是,我认为information_schema仅存在于MySQL 5及以上版本中。 - Vex
5
据我所知,在MySQL < 5中检索特定列字符集信息的最接近方法是执行SHOW FULL COLUMNS FROM tableName。 - Robin Winslow
22
这个回答非常有帮助,但如果你想解决字符集/排序规则问题,你可能还需要检查连接字符集、客户端字符集等等:显示变量如下 'character_set%'; 显示变量如下 'collation%'; - BenL
2
对于我来说,表操作返回“Empty set (0.00 sec)”。 - MinhajulAnwar
16
对于模式极客们:请注意,“schemaname”可能仅仅是数据库名称。 - BurninLeo
非常好的答案,谢谢。但是我也对schemaname感到困惑。实际上它只是一个数据库名称 :) - Paul Basenko

536

对于

SHOW FULL COLUMNS FROM table_name;

47
你好,这里是未来发言!对于任何检查此答案的人,此方法仅显示排序规则,而不是字符集。我相信这在MySQL 5时已经改变了。(请参见得分更高的答案以获取更好的方法)。 - fideloper
31
通过排序规则(collation),你可以知道字符集(charset)。这是因为排序规则(collation)的第一部分包括字符集(charset),例如,如果排序规则(collation)是latin1_swedish_ci,那么字符集(charset)除了latin1之外就不可能是其他任何东西了。如果排序规则(collation)是utf8mb4_general_ci,那么字符集(charset)除了utf8mb4之外就不可能是其他任何东西了。 - Pacerier
1
这告诉您表字符集。它不会告诉您在创建表语法中未指定字符集时将来创建的表的字符集(您需要模式字符集)。 - HoldOffHunger

239

对于数据库

USE your_database_name;
show variables like "character_set_database";
-- or:
-- show variables like "collation_database";

请参阅此页面。并查看MySQL手册。


4
这只回答了问题的三分之一。 - Tobias J
1
@TobyJ,我在https://dev59.com/6HNA5IYBdhLWcg3wNq8y#4805510上没有看到你抱怨。 - Pacerier
CF 代表什么?虽然链接不存在。@Pacerier - Yannis Dran
这应该合并在最佳答案中。它真的帮了我。 - beppe9000
@YannisDran: "cf."是拉丁语"confer"的缩写,意思是“汇集”、“比较”。通常更广泛地用于表示“参见”。 - Thomas Hedden

194

对于服务器上所有的数据库:

mysql> SELECT SCHEMA_NAME 'database', default_character_set_name 'charset', DEFAULT_COLLATION_NAME 'collation' FROM information_schema.SCHEMATA;

输出:

+----------------------------+---------+--------------------+
| database                   | charset | collation          |
+----------------------------+---------+--------------------+
| information_schema         | utf8    | utf8_general_ci    |
| my_database                | latin1  | latin1_swedish_ci  |
...
+----------------------------+---------+--------------------+

对于一个单一数据库

mysql> USE my_database;
mysql> show variables like "character_set_database";

输出:

    +----------------------------+---------+
    | Variable_name              |  Value  |
    +----------------------------+---------+
    | character_set_database     |  latin1 | 
    +----------------------------+---------+

获取表的排序规则:


mysql> USE my_database;
mysql> SHOW TABLE STATUS WHERE NAME LIKE 'my_tablename';

OR - 将输出完整的创建表SQL:

mysql> show create table my_tablename


获取的排序规则:

mysql> SHOW FULL COLUMNS FROM my_tablename;

输出:

+---------+--------------+--------------------+ ....
| field   | type         | collation          |
+---------+--------------+--------------------+ ....
| id      | int(10)      | (NULL)             |
| key     | varchar(255) | latin1_swedish_ci  |
| value   | varchar(255) | latin1_swedish_ci  |
+---------+--------------+--------------------+ ....

MySQL的哪个版本会在“type”中显示此输出?我有MySQL 5.7.9,但“type”显示列的“数据类型”,而不是“字符集”。例如,“int(10)”、“varchar(255)”等,而不是“utf8”。 - MTK
我的输出显示“type”作为数据类型,也许上面是“输出:”部分的复制粘贴错误。 - tronmcp

75

对于表格

SHOW TABLE STATUS将列出所有的表。

可以使用以下筛选条件:

SHOW TABLE STATUS where name like 'table_123';

9
请注意,show table status 中显示的排序规则(collation)并不是表的字符集。 排序规则告诉你字符如何排序或比较。例如 utf8_bin_ci 不区分大小写(不区分大小写,因此“m”和“M”是相同的),utf8_bin_cs 区分大小写(所以“m”和“M”是不同的)。 这与表的字符集不同。 - Daan
9
@Daan,停止传播错误信息。请参考https://dev59.com/6HNA5IYBdhLWcg3wNq8y#rqygEYcBWogLw_1blOqA,通过排序规则,你可以知道字符集。 - Pacerier

71

查看数据库的默认排序规则:

USE db_name;
SELECT @@character_set_database, @@collation_database;

查看表的排序:

SHOW TABLE STATUS where name like 'table_name';

查看列的排序:

SHOW FULL COLUMNS FROM table_name;

查看表的默认字符集

SHOW CREATE TABLE table_name;

就像这样!根据:MySQL文档 - We'll See

45

对于数据库

只需使用这些命令:

USE db_name;
SELECT @@character_set_database;
-- or:
-- SELECT @@collation_database;

这是官方mysql文档的答案。https://dev.mysql.com/doc/refman/8.0/en/charset-database.html - Rick

40
以下是您需要翻译的内容:
SELECT TABLE_SCHEMA,
       TABLE_NAME,
       CCSA.CHARACTER_SET_NAME AS DEFAULT_CHAR_SET,
       COLUMN_NAME,
       COLUMN_TYPE,
       C.CHARACTER_SET_NAME
  FROM information_schema.TABLES AS T
  JOIN information_schema.COLUMNS AS C USING (TABLE_SCHEMA, TABLE_NAME)
  JOIN information_schema.COLLATION_CHARACTER_SET_APPLICABILITY AS CCSA
       ON (T.TABLE_COLLATION = CCSA.COLLATION_NAME)
 WHERE TABLE_SCHEMA=SCHEMA()
   AND C.DATA_TYPE IN ('enum', 'varchar', 'char', 'text', 'mediumtext', 'longtext')
 ORDER BY TABLE_SCHEMA,
          TABLE_NAME,
          COLUMN_NAME
;
这段代码查询数据库中所有表的信息,包括表名、列名、默认字符集等。它只返回那些数据类型为枚举、字符串、文本等的列,并按照表名和列名进行排序。请注意保留原有的HTML标签。

3
非常好,Eric。只需将该代码粘贴到mysql命令行中,按回车键,您就可以获得每个数据库中每个表的每个列的字符集 :) - Jerry Krinock
1
@JerryKrinock 如果当前没有选择数据库,则获取当前数据库的所有列,否则不返回任何内容。 - Ortomala Lokni

36

我通常只查看 SHOW CREATE TABLE mydatabase.mytable

对于数据库,似乎需要查看 SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA


3
在MySQL中,数据库可以具有默认字符集。 - James
5
select default_character_set_name from information_schema.schemata 不够用,因为你无法确定哪一行与哪个数据库相关联。请使用 select default_character_set_name,schema_name from information_schema.schemata 或简单地使用 **select*from information_schema.schemata**。 - Pacerier
我使用了以下代码:SELECT * FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '<database-name>' \G;它运行得非常好 :)谢谢! - Sankalp

23

对于

show create table your_table_name

3
它会告诉你完整的SQL语句,用于创建当前表格,其中应该包括字符集。 - James
此外,如果该列没有指定特定的字符集,则使用表的默认字符集。 - Pacerier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接