字符集、排序规则
- 字符集就是 字形符号+对应的编码 的 集合
- 排序规则就是 如何理解和处理排序
mysql自觉其对字符集和排序规则的处理问题领先于其他数据库系统
基本特性:
- 分层:server、database、table、column、文字常量
- 分层:server、client
- 分层:系统配置文件、系统变量、子句
- 功能简单:每一级对下一级仅仅是起默认设置的作用,no other purpose
- 灵活:随时、随机 可以修改
- 支持丰富:
- 智能:不用担心出错!
基本命令和变量
- 命令:{show character set|show charaet} show collation;
- 变量:character_set_server collation_server、character_set_database collation_database、character_set_connection collation_connection、character_Set_client 、character_set_results、character_set_system
- 选项:--character-set-server --collation-server
注意
- 文字常量的默认字符集和排序规则是相关连接connection变量设置的。可以通过 [_character set name]'字符序列' [collation name] 修改,注意有个 "_"!
- 另外文字常量中的 转义字符总是connection连接变量指定的字符集中的"\x",意思是:如果指定的文字常量的字符集和连接级字符集设置如果不一致,转义字符会使用连接级字符集中的对应转义字符的encode!不过仅仅当connection字符集为latin??????还有只是认为转义字符的endcode必须是单字节字符集"\"???或者说:转义字符"\"在某些字符集下根本是无效的?
- nchar:本质上是ansisql标准中的char中的一个具有预先定义的字符集属性的特例而已
- unicode是character set ucs2的别名
- 字符集 和 排序规则 是相关联的。除非特殊需求,只要设置其一即可。设置字符集,即设置了默认的排序规则;设置排序规则,就肯定设置了其关联的字符集
方便的设置字符集
- set names 'character_set_name' [collate collation_name] 相当于下面的操作:
- set character_set_clent='character_set_name'
- set character_set_connection='character_set_name'
- set character_set_results='character_set_name'
- set character set 'character_set name' 相当于下面的操作:
- set character_set_clent='character_set_name'
- set collation_connection=collation_database --这一点和set names 不同
- set character_set_results='character_set_name'
使用mysql.exe内置客户端程序的字符集设置
- 选项文件配置:default-character-set
- 命令行参数:--default-character-set
- 命令:set names
- 命令:set character set
- 命令:charset --和set names 类似,但是影响以后的reconnnect
- 如果让server发出的信息、结果集不进行任何字符集转换:set character_set_results={null|binary}
- ucs2字符集不能应用于character_set_client,如果你设置了,他不起任何作用
- 查询当前设置:show variables like ‘’
对于其他客户端环境
- 你必须要考虑应用程序所处的执行环境:是否支持字符集,字符集是否兼容,有无相关的配置或初始化字符集动作等等!
如果让server发出的信息、结果集不进行任何字符集转换:set character_set_results={null|binary},这个时候结果的字符集是有character_set_system系统变量决定的
mysql的元数据 是utf8字符集编码的
排序规则
- 对于比较、排序、表达式来说,排序规则有着重要而灵活的应用。他几乎可以用在sql语句的任何部分
- binary 'str' 和 cast('str' as binary)完全相同
- binary(m) = char(m) character set binary【<>char(m) binary】。该语法是定义二进制类型的一种形式。使用于所有文本类型。注意后面是字段属性:表示使用字符集的 二进制排序规则
- 特殊的binary排序规则模式 和 _bin排序规则,二者是不相同的
- 单位不同:字节单位 和 字符编码单位
- 字符集转换:无 和 有
- 对某些函数的影响lower()...:有 和 无
- 比较时是否考虑尾随空格:考虑 和 不考虑
- 插入 和 获取是尾随空格的处理:char(m)或右填充空格,但获取是trim掉;而binary(m)或右填充0x00,获取是保留
- 字符集和排序规则的压缩性
- unicode字符集 和 非unicode字符集,总是转换非 unicode字符集 到unicode字符集
- 同一个字符集下的"_bin"、"_cs"、"_ci"字符集混杂时,总是应用"_bin"的排序规则
- 如果可压缩性形同,字符集相同,又不属于以上情况(排序规则为"_cs"、"_ci"),哈哈哈,你死了!
- 越小越高越稳定:
- 0:collate子句
- 1:两个不同排序规则的字符串连接
- 2:表列、存储程序、本地变量
- 3:系统常量、系统函数
- 4:文本常量的排序规则
- 5:null
- 字符集中字元的包容性:ascii是安全的
- 字符集对模型操作、函数的影响
- 简单函数的输出字符数据的字符集、排序规则和输入参数的完全相同:instr、mid、substring、lower、lcase、ucase、upper、left、right、ltrim、rtrim、trim、reverse、repea、rpad、soundex,特殊的replace总是大小写敏感的
- charset()、collation()函数返回字符串的字符集、排序规则
- 对于多个输入,一个输出的函数:
- 如果有一个collate子句,就是他了
- 如果有2或更多个collate子句,恭喜,你死了
- 如果collation 都相同,就用它
- 其他,binary
显示字符集转换
- convert('str' using character_set_name) --ansi sql标准
- cast('str' as 字符数据类型 character set character_set_name)
- cast('str' as 字符数据类型 ) collate collation_name