• 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
  • 相关阅读:
    Netty实现Unity登录验证(三)
    Netty实现Unity登录验证(二)
    Netty实现Unity登录验证(一)
    Unity RPC 链接
    摄像机跟随物体,修复物体遮挡
    Character Shader 含半透明及受击效果
    空Shader重新指认工具
    Box波浪运动的一种实现
    查找所有有多个 Texture 的 Matrial
    数据生成XML导入Excel
  • 原文地址:https://www.cnblogs.com/jinzhenshui/p/1496382.html
Copyright © 2020-2023  润新知