# 10.2.2元数据的UTF-8
元数据是“关于数据的数据”任何描写数据库,而不是目录数据库的核心是元数据。因此,列名、数据库名、用户名、版本名和大多数字符串都是由显示
是元数据。中表格的内容也是如此信息模式
因为根据定义,这些表包含有关数据库对象的信息。
元数据的表示必须满足以下要求:
所有元数据必须在同一字符集中。否则,无论是
显示
声明或选择
中的表的语句信息模式
将正常工作,因为这些操作结果的同一列中的不同行将位于不同的字符集中。元数据必须包含所有语言中的所有字符。否则,用户将无法使用自己的语言命名列和表。
为了满足这两个要求,MySQL以Unicode字符集(即UTF-8)存储元数据。如果从不使用重音或非拉丁字符,这不会造成任何中断。但如果你这么做了,你应该知道元数据是在UTF-8中。
元数据要求意味着
用户()
,当前用户()
,会话_用户()
,系统_用户()
,数据库()
和版本()
默认情况下,函数具有UTF-8字符集。服务器设置
字符集系统
元数据字符集名称的系统变量:
mysql> SHOW VARIABLES LIKE 'character_set_system';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| character_set_system | utf8 |
+----------------------+-------+
使用Unicode存储元数据不这意味着服务器返回列的标题和描述
中的功能字符集系统
默认设置为字符集。当你使用从t中选择column1
,名字专栏1
它本身从服务器返回到客户机,返回的字符集由字符集结果
系统变量,其默认值为utf8mb4
。如果希望服务器以不同的字符集传回元数据结果,请使用定名
语句强制服务器执行字符集转换。定名
设定字符集结果
以及其他相关的系统变量。(见第10.4节,“连接字符集和排序规则”)或者,客户端程序可以在从服务器接收结果后执行转换。客户机执行转换的效率更高,但并非所有客户机都可以使用此选项。
如果字符集结果
即将无效的
,则不执行任何转换,服务器使用其原始字符集(由字符集系统
).
与元数据一样,从服务器返回到客户端的错误消息会自动转换为客户端字符集。
如果您正在使用(例如)用户()
函数用于在单个语句中进行比较或赋值,不用担心。MySQL为您执行一些自动转换。
SELECT * FROM t1 WHERE USER() = latin1_column;
这是因为拉丁1_列
在比较之前自动转换为UTF-8。
INSERT INTO t1 (latin1_column) SELECT USER();
这是因为用户()
自动转换为拉丁语1
在作业之前。
尽管SQL标准中没有自动转换,但该标准确实规定每个字符集(就支持的字符而言)都是Unicode的“子集”。因为“适用于超集的内容可以适用于子集”这一众所周知的原则,我们相信Unicode的排序规则可以适用于与非Unicode字符串的比较。有关强制字符串的更多信息,请参阅第10.8.4节,“表达式中的排序强制性”.