如何查看MySQL数据库/表/列的字符集?


Answers:


743

这是我的做法-

对于模式(或数据库-它们是同义词):

SELECT default_character_set_name FROM information_schema.SCHEMATA 
WHERE schema_name = "schemaname";

对于表:

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 = "schemaname"
  AND T.table_name = "tablename";

对于列:

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

3
应该注意的是,我相信information_schema仅在MySQL 5起。
Vex

4
至于我可以告诉你可以在MySQL中<5检索列特定的字符集信息最接近的是做SHOW FULL COLUMNS FROM表名
罗宾·温斯洛

14
这个答案很有帮助,但是如果您想解决一个characterset / collat​​ion问题,您可能还需要检查连接character_set,client_character_set等。。。显示变量,例如“归类%”;
BenL 2015年

2
表操作为我返回“空集(0.00秒)”
minhajul 2015年

9
对于Schema-Dummies:请注意,这schemaname可能只是数据库名称。
BurninLeo

465

对于

SHOW FULL COLUMNS FROM table_name;

43
您好,这是未来的演讲!对于检查此答案的任何人,此方法仅显示排序规则,而不显示字符集。我相信这在MySQL 5上有所改变。(有关更多方法,请参见答案)。
fideloper 2014年

20
@fideloper,通过排序规则可以告诉字符集。这是因为排序规则的第一部分包括字符集,例如,如果排序规则为latin1_swedish_ci,则字符集只能是latin1。如果排序规则是utf8mb4_general_ci,字符集除了不能是其他字符utf8mb4
Pacerier,2015年

1
这告诉您表字符集。当在create table语法中未指定任何字符集时,它不会告诉您将来创建的表的字符集(为此您将需要模式字符集)。
HoldOffHunger


150

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

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';

或-将输出用于创建表的完整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显示data type的列而不是character set。有些像 int(10) varchar(255)...等等而不是utf8
MTK

我的输出也显示typedata type@MTK,也许上面是“输出:”部分中的复制粘贴错误。
tronmcp

65

对于

SHOW TABLE STATUS 将列出所有表格。

筛选使用:

SHOW TABLE STATUS where name like 'table_123';

9
请注意。显示表状态中显示的排序规则不是表的字符集。排序规则告诉您如何对字符进行排序/比较。例如,utf8_bin_ci比较数据时不考虑大小写(不区分大小写,因此“ m”和“ M”相同),utf8_bin_cs比较时区分大小写(因此“ m”和“ M”是不同的)。这与表的字符集不同。
大安2014年

6
@Daan,别再散布错误信息了。请参阅stackoverflow.com/questions/1049728/…,使用排序规则可以告诉字符集。
Pacerier

44

对于数据库

只需使用以下命令:

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

34
SELECT TABLE_SCHEMA,
       TABLE_NAME,
       CCSA.CHARACTER_SET_NAME AS DEFAULT_CHAR_SET,
       COLUMN_NAME,
       COLUMN_TYPE,
       C.CHARACTER_SET_NAME
  来自information_schema.TABLES AS T
  使用信息(TABLE_SCHEMA,TABLE_NAME)加入INFORMATION_SCHEMA.COLUMNS
  以CCSA身份加入information_schema.COLLATION_CHARACTER_SET_APPLICABILITY
       开启(T.TABLE_COLLATION = CCSA.COLLATION_NAME)
 在哪里TABLE_SCHEMA = SCHEMA()
   AND C.DATA_TYPE IN('enum','varchar','char','text','mediumtext','longtext')
 按TABLE_SCHEMA排序,
          TABLE_NAME,
          COLUMN_NAME
;

2
很好,埃里克。只需将该代码粘贴到mysql命令行中,按回车键,即可获得每个数据库中每个表中每一列的字符集:)
Jerry Krinock

1
@JerryKrinock您将获得当前数据库的每一列,如果未选择任何数据库,则不会获得任何内容。
Ortomala Lokni

24

我总是只看SHOW CREATE TABLE mydatabase.mytable

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


3
mysql数据库中的字符可以具有默认字符集
James

3
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 2015年

23

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

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

要查看表的排序规则:

SHOW TABLE STATUS where name like 'table_name';

要查看列的排序规则:

SHOW FULL COLUMNS FROM table_name;

21

对于

show create table your_table_name

2
它告诉您将用于创建当前表的完整SQL,其中应包含它的字符集。
詹姆斯

另外,如果该列未声明特定的字符集,则它正在使用表的默认字符集。
Pacerier,2015年

18

对于数据库

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

输出示例:

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    |
| drupal_demo1               | utf8    | utf8_general_ci    |
| drupal_demo2               | utf8    | utf8_general_ci    |
| drupal_demo3               | utf8    | utf8_general_ci    |
| drupal_demo4               | utf8    | utf8_general_ci    |
| drupal_demo5               | latin1  | latin1_swedish_ci  |

...

+----------------------------+---------+--------------------+
55 rows in set (0.00 sec)

mysql> 


1
@Pacerier您实际上将我的答案与这些答案进行了比较吗?
sjas's

15

对于数据库

SHOW CREATE DATABASE "DB_NAME_HERE";

在创建数据库(MySQL)时,默认字符集/排序规则始终为LATIN,而是在最初创建数据库时选择了其他字符集/排序规则


3
MySQL中“默认字符集/排序规则始终为拉丁” 所需引用
Pacerier,2015年

需要引用吗?您曾经使用过MySQL数据库吗?每个人都知道默认的字符集/排序规则是latin1_swedish_ci因为MySQL的创建者Monty Widenius是瑞典人,开始时并没有想像中的那样。
Spencer Williams

5

如许多人先前所写,SHOW FULL COLUMNS应该是获取列信息的首选方法。缺少的是在此之后无需直接访问元数据表即可获取字符集的方法:

SHOW FULL COLUMNS FROM my_table WHERE Field = 'my_field'
SHOW COLLATION WHERE Collation = 'collation_you_got'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.