• Character Set 和 Collation 的概念

    两者的概念与关系
    服务器君一共花费 23.139 ms 进行了 2 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    使用 MySQL 创建数据表的时候, 总免不了要涉及到 character set 和 collation 的概念,这里就补一下。

    character set 和 collation 的是什么?

    character set, 即字符集。

    我们常看到的 utf-8, GB2312, GB18030 都是相互独立的 character set. 即对 Unicode 的一套编码。

    那么如何理解 unicode 与 utf-8, GB2312 的区别呢?打个比方,你眼前有一个苹果,在英文里称之为 apple,而在中文里称之为苹果。苹果这个实体的概念就是 unicode, 而 utf-8, GB2312 可以认为就是不同语言对苹果的不同称谓,本质上都是在描述苹果这个物。

    collation, 即比对方法。

    用于指定数据集如何排序,以及字符串的比对规则。

    character set 与 collation 的关系

    软件国际化是大势所趋, 所以 unicode 是国际化最佳的选择。当然为了提高性能,有些情况下还是使用 latin1 比较好。

    mysql 有两个支持 unicode 的 character set:

    • ucs2: 使用 16 bits 来表示一个 unicode 字符。
    • utf8: 使用 1~3 bytes 来表示一个 unicode 字符。

    选择哪个 character set 视情况而定,例如 utf8 表示 latin 字符只需要一个字节,所以当用户数据大部分为英文等拉丁字符时,使用 utf8 比较节省数据库的存储空间。

    每个 character set 会对应一定数量的 collation. 查看方法是在 mysql 的 console 下输入:

    mysql> show collation;
    +-----------------------+----------+-----+---------+----------+---------+
    | Collation             | Charset  | Id  | Default | Compiled | Sortlen |
    +-----------------------+----------+-----+---------+----------+---------+
    | big5_chinese_ci       | big5     |   1 | Yes     | Yes      |       1 |
    | big5_bin              | big5     |  84 |         | Yes      |       1 |
    | latin1_swedish_ci     | latin1   |   8 | Yes     | Yes      |       1 |
    | ascii_general_ci      | ascii    |  11 | Yes     | Yes      |       1 |
    | ascii_bin             | ascii    |  65 |         | Yes      |       1 |
    | gb2312_chinese_ci     | gb2312   |  24 | Yes     | Yes      |       1 |
    | gb2312_bin            | gb2312   |  86 |         | Yes      |       1 |
    | gbk_chinese_ci        | gbk      |  28 | Yes     | Yes      |       1 |
    | gbk_bin               | gbk      |  87 |         | Yes      |       1 |
    | latin5_turkish_ci     | latin5   |  30 | Yes     | Yes      |       1 |
    | latin5_bin            | latin5   |  78 |         | Yes      |       1 |
    | armscii8_general_ci   | armscii8 |  32 | Yes     | Yes      |       1 |
    | armscii8_bin          | armscii8 |  64 |         | Yes      |       1 |
    | utf8_general_ci       | utf8     |  33 | Yes     | Yes      |       1 |
    | utf8_bin              | utf8     |  83 |         | Yes      |       1 |
    | utf8_unicode_ci       | utf8     | 192 |         | Yes      |       8 |
    | utf8_icelandic_ci     | utf8     | 193 |         | Yes      |       8 |
    | utf8_latvian_ci       | utf8     | 194 |         | Yes      |       8 |
    | ucs2_general_ci       | ucs2     |  35 | Yes     | Yes      |       1 |
    | ucs2_bin              | ucs2     |  90 |         | Yes      |       1 |
    | ucs2_unicode_ci       | ucs2     | 128 |         | Yes      |       8 |
    | ucs2_icelandic_ci     | ucs2     | 129 |         | Yes      |       8 |
    | utf8mb4_bin           | utf8mb4  |  46 |         | Yes      |       1 |
    | utf8mb4_unicode_ci    | utf8mb4  | 224 |         | Yes      |       8 |
    | utf8mb4_icelandic_ci  | utf8mb4  | 225 |         | Yes      |       8 |
    | cp1251_general_ci     | cp1251   |  51 | Yes     | Yes      |       1 |
    | cp1251_general_cs     | cp1251   |  52 |         | Yes      |       1 |
    | utf16_general_ci      | utf16    |  54 | Yes     | Yes      |       1 |
    | utf16_bin             | utf16    |  55 |         | Yes      |       1 |
    | utf16_unicode_ci      | utf16    | 101 |         | Yes      |       8 |
    | utf16_icelandic_ci    | utf16    | 102 |         | Yes      |       8 |
    | utf32_unicode_ci      | utf32    | 160 |         | Yes      |       8 |
    | utf32_icelandic_ci    | utf32    | 161 |         | Yes      |       8 |
    +-----------------------+----------+-----+---------+----------+---------+
    

    collation 名字的规则可以归纳为这两类:

    • 1. <character set>_<language/other>_<ci/cs>
    • 2. <character set>_bin</li>

    例如: utf8_danish_ci

    ci 是 case insensitive 的缩写, cs 是 case sensitive 的缩写。即,指定大小写是否敏感。奇怪的是 utf8 字符集对应的 collation 居然没有一个是 cs 的。

    mysql> show collation like 'utf8%';
    +-----------------------+---------+-----+---------+----------+---------+
    | Collation             | Charset | Id  | Default | Compiled | Sortlen |
    +-----------------------+---------+-----+---------+----------+---------+
    | utf8_general_ci       | utf8    |  33 | Yes     | Yes      |       1 |
    | utf8_bin              | utf8    |  83 |         | Yes      |       1 |
    | utf8_unicode_ci       | utf8    | 192 |         | Yes      |       8 |
    | utf8_icelandic_ci     | utf8    | 193 |         | Yes      |       8 |
    | utf8_latvian_ci       | utf8    | 194 |         | Yes      |       8 |
    | utf8_romanian_ci      | utf8    | 195 |         | Yes      |       8 |
    | utf8_slovenian_ci     | utf8    | 196 |         | Yes      |       8 |
    | utf8_polish_ci        | utf8    | 197 |         | Yes      |       8 |
    | utf8_estonian_ci      | utf8    | 198 |         | Yes      |       8 |
    | utf8_spanish_ci       | utf8    | 199 |         | Yes      |       8 |
    | utf8_swedish_ci       | utf8    | 200 |         | Yes      |       8 |
    | utf8_turkish_ci       | utf8    | 201 |         | Yes      |       8 |
    | utf8_czech_ci         | utf8    | 202 |         | Yes      |       8 |
    | utf8_danish_ci        | utf8    | 203 |         | Yes      |       8 |
    | utf8_lithuanian_ci    | utf8    | 204 |         | Yes      |       8 |
    | utf8_slovak_ci        | utf8    | 205 |         | Yes      |       8 |
    | utf8_spanish2_ci      | utf8    | 206 |         | Yes      |       8 |
    | utf8_roman_ci         | utf8    | 207 |         | Yes      |       8 |
    | utf8_persian_ci       | utf8    | 208 |         | Yes      |       8 |
    | utf8_esperanto_ci     | utf8    | 209 |         | Yes      |       8 |
    | utf8_hungarian_ci     | utf8    | 210 |         | Yes      |       8 |
    | utf8_sinhala_ci       | utf8    | 211 |         | Yes      |       8 |
    | utf8mb4_general_ci    | utf8mb4 |  45 | Yes     | Yes      |       1 |
    | utf8mb4_bin           | utf8mb4 |  46 |         | Yes      |       1 |
    | utf8mb4_unicode_ci    | utf8mb4 | 224 |         | Yes      |       8 |
    | utf8mb4_icelandic_ci  | utf8mb4 | 225 |         | Yes      |       8 |
    | utf8mb4_latvian_ci    | utf8mb4 | 226 |         | Yes      |       8 |
    | utf8mb4_romanian_ci   | utf8mb4 | 227 |         | Yes      |       8 |
    | utf8mb4_slovenian_ci  | utf8mb4 | 228 |         | Yes      |       8 |
    | utf8mb4_polish_ci     | utf8mb4 | 229 |         | Yes      |       8 |
    | utf8mb4_estonian_ci   | utf8mb4 | 230 |         | Yes      |       8 |
    | utf8mb4_spanish_ci    | utf8mb4 | 231 |         | Yes      |       8 |
    | utf8mb4_swedish_ci    | utf8mb4 | 232 |         | Yes      |       8 |
    | utf8mb4_turkish_ci    | utf8mb4 | 233 |         | Yes      |       8 |
    | utf8mb4_czech_ci      | utf8mb4 | 234 |         | Yes      |       8 |
    | utf8mb4_danish_ci     | utf8mb4 | 235 |         | Yes      |       8 |
    | utf8mb4_lithuanian_ci | utf8mb4 | 236 |         | Yes      |       8 |
    | utf8mb4_slovak_ci     | utf8mb4 | 237 |         | Yes      |       8 |
    | utf8mb4_spanish2_ci   | utf8mb4 | 238 |         | Yes      |       8 |
    | utf8mb4_roman_ci      | utf8mb4 | 239 |         | Yes      |       8 |
    | utf8mb4_persian_ci    | utf8mb4 | 240 |         | Yes      |       8 |
    | utf8mb4_esperanto_ci  | utf8mb4 | 241 |         | Yes      |       8 |
    | utf8mb4_hungarian_ci  | utf8mb4 | 242 |         | Yes      |       8 |
    | utf8mb4_sinhala_ci    | utf8mb4 | 243 |         | Yes      |       8 |
    +-----------------------+---------+-----+---------+----------+---------+
    44 rows in set
    

    同一个 character set 的不同 collation 的区别在于排序、字符春对比的准确度(相同两个字符在不同国家的语言中的排序规则可能是不同的)以及性能。比如utf8_general_ci 在排序的准确度上要逊于 utf8_unicode_ci, 当然,对于英语用户应该没有什么区别。但性能上(排序以及比对速度)要略优于 utf8_unicode_ci. 具体可以参照 utf8_general_ci和utf8_unicode_ci的区别

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [移动开发] Android根基概念Context 8 个条目
  2. [C语言程序设计] 结构体基本知识 1 个条目
  3. [Python程序设计] Django 入门知识浅介 10 个条目
  4. [Python程序设计] urls.py设置技巧 8 个条目
  5. [PHP程序设计] 对输入文件类型的检测 1 个条目
  6. [Python程序设计] 标准库:urllib/urllib2 14 个条目
  7. [Python程序设计] Python语言概述 6 个条目
  8. [PHP程序设计] 声明式编程范式 12 个条目
  9. [智力开发与知识管理] 超越整体性学习 5 个条目
  10. [智力开发与知识管理] 整体性学习步骤 9 个条目
  11. [移动开发] Android 开发调试工具 ADB 3 个条目
  12. [移动开发] 刷机与root相关 2 个条目
窗口 -- [博客]