和校对规则: 如果指定了CHARACTER SET X和COLLATE Y,那么采用CHARACTER SET X和COLLATE Y。如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET X的默认校对规则。否则,采用服务器字符集和服务器校对规则。
如果在列定义中没有指定列字符集和校对规则,则默认使用表字符集和校对规则。表字符集和校对规则是mysql的扩展;在标准SQL中没有。
4、列字符集和校对
每一个“字符”列(即,CHAR、VARCHAR或TEXT类型的列)有一个列字符集和一个列校对规则,它不能为空。列定义语法有一个可选子句来指定列字符集和校对规则:
col_name {CHAR | VARCHAR | TEXT} ( col_length )
[CHARACTER SET charset_name [COLLATE collation_name ]]
例如:
create table table1
(
column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci
);
mysql按照下面的方式选择列字符集和校对规则:
如果指定了CHARACTER SET X和COLLATE Y,那么采用CHARACTER SET X和COLLATE Y。如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET X的默认校对规则。否则,采用表字符集和校对规则。
CHARACTER SET和COLLATE子句是标准的SQL。
5、连接字符集和校对
一些字符集和校对规则系统变量与客户端和服务器的交互有关,前面已经提到:
服务器字符集和校对规则可以用作character_set_server和collation_server变量的值。默认数据库的字符集和校对规则可以用作character_set_database和collation_database变量的值。
在客户端和服务器的连接处理中也涉及了字符集和校对规则变量。每一个客户端有一个连接相关的字符集和校对规则变量。
考虑什么是一个“连接”:它是连接服务器时所作的事情。客户端发送SQL语句,例如查询,通过连接发送到服务器。服务器通过连接发送响应给客户端,例如结果集。对于客户端连接,这样会导致一些关于连接的字符集和校对规则的问题,这些问题均能够通过系统变量来解决:
当查询离开客户端后,在查询中使用哪种字符集?
服务器使用character_set_client变量作为客户端发送的查询中使用的字符集。
l服务器接收到查询后应该转换为哪种字符集?
转换时,服务器使用character_set_connection和collation_connection系统变量。它将客户端发送的查询从character_set_client所指示的字符集转换到character_set_connection所指示的字符集(除非字符串文字具有象_latin1 或_utf8的引介词)。collation_connection对比较文字字符串是重要的。对于列值的字符串比较,它不重要,因为列具有更高的校对规则优先级。
进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下:
a、使用每个数据字段的CHARACTER SET设定值;
b、若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(mysql扩展,非sql标准);
c、若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值;
d、若上述值不存在,则使用character_set_server设定值。
服务器发送结果集或返回错误信息到客户端之前应该转换为哪种字符集?
character_set_results变量指示服务器返回查询结果到客户端使用的字符集。包括结果数据,例如列值和结果元数据(如列名)。
能够调整这些变量的设置,或可以依赖默认值。
有两个语句影响连接字符集:
set names ' charset_name ' SET CHARACTER SET charset_name;
set names显示客户端发送的sql语句中使用什么字符集。因此,set names 'cp1251'语句告诉服务器“将来从这个客户端传来的信息采用字符集cp1251”。它还为服务器发送回客户端的结果指定了字符集。(例如,如果你使用一个SELECT语句,它表示列值使用了什么字符集)
当一个客户端连接时,它向服务器发送希望使用的字符集名称。服务器为那个字符集设置 character_set_client、character_set_results和 character_set_connection变量。(实际上,服务器为使用该字符集执行一个set names操作。)
对于mysql客户端,如果你希望使用与默认字符集不同的字符集,不需要每次启动时执行set names语句。可以在mysql语句行中或者选项文件中添加一个--default-character-set选项设置。例如,你每次运行mysql时,以下的选项文件设置把三个字符集变量修改为utf8: