元数据是”关于数据的数据。”任何东西描述了数据库,而不是内容是元数据。因此,列名、数据库名、用户名、版本名和大部分字符串都是由显示
是元数据。中的表的内容也是如此INFORMATION_SCHEMA
因为根据定义,这些表包含关于数据库对象的信息。
元数据的表示必须满足以下要求:
为了满足这两个需求,MySQL将元数据存储在Unicode字符集中,即UTF-8。如果您从未使用重音字符或非拉丁字符,这不会导致任何中断。但是如果您这样做,您应该注意元数据是UTF-8格式的。
元数据要求意味着用户()
,CURRENT_USER ()
,为SESSION_USER ()
,SYSTEM_USER ()
,数据库()
,(版本)
函数默认使用UTF-8字符集。
服务器设置character_set_system
系统变量为元数据字符集的名称:
mysql>显示变量为'character_set_system';+----------------------+-------+ | Variable_name |值 | +----------------------+-------+ | character_set_system | utf8 | +----------------------+-------+
使用Unicode存储元数据可以不表示服务器返回列的标题和的结果描述
的函数character_set_system
默认字符集。当你使用SELECT columnn1 FROM t
,这个名字column1
的值确定的字符集中从服务器返回到客户机character_set_results
系统变量,默认值为use utf8
.如果希望服务器以不同的字符集将元数据结果传回,请使用组名称
语句强制服务器执行字符集转换。组名称
设置character_set_results
和其他相关的系统变量。(见第10.4节“连接字符集和排序规则”)。或者,客户机程序可以在从服务器接收到结果后执行转换。由客户机执行转换效率更高,但这个选项并不总是对所有客户机都可用。
如果character_set_results
设置为零
,则不执行转换,服务器使用其原始字符集(由character_set_system
).
与元数据一样,从服务器返回到客户机的错误消息将自动转换为客户机字符集。
如果您正在使用(例如)用户()
函数在单个语句中进行比较或赋值,不要担心。MySQL为您执行一些自动转换。
SELECT * FROM t1 WHERE USER() = latin1_column;
这是因为内容latin1_column
在比较之前自动转换为UTF-8。
INSERT INTO t1 (latin1_column) SELECT USER()
这是因为内容用户()
自动转换为latin1
作业之前。
尽管SQL标准中没有自动转换,但该标准确实说每个字符集(就支持的字符而言)都是a”子集”Unicode。因为这是一个众所周知的原则”适用于超集的东西也适用于子集,”我们相信Unicode的排序规则可以应用于与非Unicode字符串的比较。有关字符串强制转换的更多信息,请参见第10.8.4节,“表达式中的排序强制力”.