Mysql:语法:字符集、排序规则

字符集、排序规则

  • 字符集就是 字形符号+对应的编码  的 集合
  • 排序规则就是 如何理解和处理排序

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] 相当于下面的操作
  1. set character_set_clent='character_set_name'
  2. set character_set_connection='character_set_name'
  3. set character_set_results='character_set_name'
  • set character set 'character_set name' 相当于下面的操作:
  1. set character_set_clent='character_set_name'
  2. set collation_connection=collation_database  --这一点和set names 不同
  3. 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是安全的
  • 字符集对模型操作、函数的影响
  1. 简单函数的输出字符数据的字符集、排序规则和输入参数的完全相同:instr、mid、substring、lower、lcase、ucase、upper、left、right、ltrim、rtrim、trim、reverse、repea、rpad、soundex,特殊的replace总是大小写敏感的
  2. charset()、collation()函数返回字符串的字符集、排序规则
  3. 对于多个输入,一个输出的函数:
  • 如果有一个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
原文地址:https://www.cnblogs.com/jinzhenshui/p/1496382.html