zoukankan      html  css  js  c++  java
  • MySQL学习字符串属性

    二进制字符串的比较是通过逐个字节的比较字节数值来进行的。二进制字符串不和字符集相关联。

    非二进制字符串是一个Collation列,他存放包含特定字符集和Collation的文本,字符集规定了能够存入字符串的文本,而Collation则规定了对字符进行比较和排序的时候的特性。

    所以说非二进制字符串的特征之一就是他们有一个字符集。

    如果想查看系统中有哪些字符集的话库银使用下面的命令:

    show character set;

    输出的结果很长,我截取了一些:

    +----------+-----------------------------+---------------------+--------+
    | Charset  | Description                 | Default collation   | Maxlen |
    +----------+-----------------------------+---------------------+--------+
    | big5     | Big5 Traditional Chinese    | big5_chinese_ci     |      2 |
    | dec8     | DEC West European           | dec8_swedish_ci     |      1 |
    | cp850    | DOS West European           | cp850_general_ci    |      1 |
    | hp8      | HP West European            | hp8_english_ci      |      1 |

    有些字符集只包含单字节字符,而有些字符集包含多字节字符。有些多字节字符集中的字符有固定数目的字节来表示,但是有些多字节字符集中的字符长度却是可变的。比如unicode使用ucs2字符集来保存,其中的字符都占2个字节,也可以使用utf-8字符集来表示,其中的每个字符都占用一个到3个字节不等。

    我们可以使用LRNGTH()和CHAR_LENGTH()函数来判断给定的字符串中是否包含多字节字符。这两个函数分别返回字符串中的字节数和字符数。如果LENGTH()的值大于CHAR_LENGTH()的大小,那么一定有多字节字符。

    set @s= convert('abc' using ucs2);
    select length(@s), char_length(@s);

    +------------+-----------------+
    | length(@s) | char_length(@s) |
    +------------+-----------------+
    |          6 |               3 |
    +------------+-----------------+

    从结果中可以看出每个ucs2字符串都包含多字节字符。

    虽然unicode字符集utf8中包含多字节字符,但是一个具体的utf8字符串却可能只包含单字节字符,比如:

    set @s= convert('abc' using utf8);
    select length(@s),char_length(@s);

    +------------+-----------------+
    | length(@s) | char_length(@s) |
    +------------+-----------------+
    |          3 |               3 |
    +------------+-----------------+

    非二进制字符串的另外一个特征是Collation,她决定字符串中字符排序的次序,如果想查看系统中有哪些Collation可用

    show collation;

    输出结果很长,我截取了一部分:

    +--------------------------+----------+-----+---------+----------+---------+
    | Collation                | Charset  | Id  | Default | Compiled | Sortlen |
    +--------------------------+----------+-----+---------+----------+---------+
    | big5_chinese_ci          | big5     |   1 | Yes     | Yes      |       1 |
    | big5_bin                 | big5     |  84 |         | Yes      |       1 |
    | dec8_swedish_ci          | dec8     |   3 | Yes     | Yes      |       1 |
    | dec8_bin                 | dec8     |  69 |         | Yes      |       1 |

    当没有指定使用何种Collation的是,Default中为Yes的collation就是这个字符集中字符串默认的Cllation。默认的Collation也可以使用:show character set; 进行查看。

    Collation可以是大小写敏感的,大小写不敏感的,或者二进制的。名称ci,cs,bin结尾的Collation分别是大小写不敏感,大小写敏感、二进制的。

    二进制字符串的比较总是以单个字节为单元的,而二进制Collation对于非二进制字符和窜的比较却是以字符为单元的。

    下面的例子说明了Collation如何影响排序结果:

    create table t (c char(3) character set latin1);
    insert into t values('AAA'),('bbb'),('aaa'),('BBB');
    select c from t;

    +------+
    | c    |
    +------+
    | AAA  |
    | bbb  |
    | aaa  |
    | BBB  |
    +------+

    通过对列使用collate操作符,我们可以在选择排序的时候使用哪一个Collation从而影响结果顺序:

    1)一个大小写不敏感的Collation将会吧a和A排列在一起。比如:

    select c from t order by c collate latin1_swedish_ci;

    +------+
    | c    |
    +------+
    | AAA  |
    | aaa  |
    | bbb  |
    | BBB  |
    +------+

    2)一个大小写敏感的Collation将会吧A和a排列在B和b的签名但是还会将大写排在小写的前面:

    select c from t order by c collate latin1_general_cs;

    +------+
    | c    |
    +------+
    | AAA  |
    | aaa  |
    | BBB  |
    | bbb  |
    +------+

    3)一个二进制Collation使用字符的数值为他们排序:

    select c from t order by c collate latin1_bin;

    +------+
    | c    |
    +------+
    | AAA  |
    | BBB  |
    | aaa  |
    | bbb  |
    +------+


    ==============================================================================

    本博客已经废弃,不在维护。新博客地址:http://wenchao.ren


    我喜欢程序员,他们单纯、固执、容易体会到成就感;面对压力,能够挑灯夜战不眠不休;面对困难,能够迎难而上挑战自我。他
    们也会感到困惑与傍徨,但每个程序员的心中都有一个比尔盖茨或是乔布斯的梦想“用智慧开创属于自己的事业”。我想说的是,其
    实我是一个程序员

    ==============================================================================
  • 相关阅读:
    Golang Failpoint 的设计与实现
    没涉及到最值求解;观点:矩阵乘法无法表达出结果。 现实生活中事件、现象的数学表达
    多元微分学 枚举破解15位路由器密码 存储空间限制 拆分减长,求最值 数据去重
    ARP Poisoning Attack and Mitigation Techniques ARP欺骗 中间人攻击 Man-In-The-Middle (MITM) attack 嗅探 防范 Can one MAC address have two different IP addresses within the network?
    The C10K problem
    HTTP Streaming Architecture HLS 直播点播 HTTP流架构
    现代IM系统中消息推送和存储架构的实现
    现代IM系统中的消息系统架构
    长连接锁服务优化实践 C10K问题 nodejs的内部构造 limits.conf文件修改 sysctl.conf文件修改
    doubleclick cookie、动态脚本、用户画像、用户行为分析和海量数据存取 推荐词 京东 电商 信息上传 黑洞 https://blackhole.m.jd.com/getinfo
  • 原文地址:https://www.cnblogs.com/rollenholt/p/2656747.html
Copyright © 2011-2022 走看看