MySQL中的字符集和排序规则优先级

时间:2018-10-11 10:13:36

标签: mysql character-encoding

在MySQL中,我可以在服务器数据库级别上配置字符集和排序规则。

这是相同的优先级吗?从最小到最具体?
我没有在DOCS中找到它。

例如:

服务器级别

SHOW VARIABLES LIKE "char%"; 
结果是:
character_set_client        utf8
character_set_connection    utf8
character_set_database      latin1
character_set_filesystem    binary
character_set_results       utf8
character_set_server        latin1
character_set_system        utf8

数据库级别

SELECT * FROM information_schema.SCHEMATA;
结果是:
name        character_set_name  collation_name
my_database latin1              latin1_swedish_ci

表级别

SELECT T.table_name, 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 = "my_database";
结果是:
table_name      character_set_name
my_table1           latin1
my_table2           utf8

2 个答案:

答案 0 :(得分:0)

您将在手册10.3 Specifying Character Sets and Collations的此部分及后续页面中找到不同级别(服务器,数据库,表和列)的详细信息。在数据库,表和列级别,它声明如果未显式设置字符集和排序规则,则使用上一级别的字符集和排序规则,这相当于您对最具体概念的了解最少。

答案 1 :(得分:0)

创建表时,数据库设置是默认
创建列时,表格设置是默认
列设置是唯一重要的事情。

嗯,那不是完全正确的。您需要指定 client 使用哪种编码(CHARACTER SET)和排序规则。这就是character_set_client/connection/results发挥作用的地方。通常将这3个设置为相同,但不需要匹配列的CHARACTER SET

如果该列与这些设置不匹配,则MySQL将在客户端和服务器之间传递字节时对它们进行动态转码。请注意,这使您可以为 same 表中的不同列使用不同的字符集。

上一段对表和数据库设置没有任何说明-因为它们是不相关的。 (因为它们只是默认值。)将表CREATEd设置为{1}后,每一列的字符集都被设置为“石头”。