字符集支持
MySQL 4.1版本改进了对字符集处理的支持。这里描述的特性是MySQL 4.1.1 里已经
实现的。(MySQL 4.1.0里有一些,不过不包含这里的全部特性,并且有的实现也是不同的)
本章讨论下面的主题:
·什么是字符集和 collations?
·The multiple-level default system
·MySQL 4.1 里新的语法
·Affected functions and operations
·Unicode 支持
·每种特殊字符集和 collation 的含义
现在在 MyISAM, MEMORY (HEAP), 和 (从 MySQL 4.1.2开始) InnoDB 等存储引擎里包含
字符集支持. ISAM 存储引擎不包含字符集支持; 也没有计划加入, 因为 ISAM 已经被
淘汰了
10.1 字符集和Collations的一般介绍
一个character set (字符集)是一组符号和编码,而一个 collation 是在一个字符集里
比较字符的一套规则,让我们通过一个虚构的字符集例子来说明区别。
假设我们有个四个字母的字母表:`A‘, `B‘, `a‘, `b‘.我们给每个字母一个编号:
`A‘ = 0, `B‘ = 1, `a‘ = 2, `b‘ = 3. 字母`A‘ 是一个符号,而数字0是 `A‘ 的
encoding(编码),而这四个字母和他们的编码合起来就是一个字符集(character set)。
现在,假设我们要比较两个字符串的值,`A‘ 和`B‘,最简单的方法是看编码,`A‘ 是 0
而 `B‘是 1. 因为0比1小,我们就说`A‘ 比 `B‘ 小。现在,我们就算已经对我们的字符
集使用了一个collation,collation 是一组规则(在这个例子里只有一条规则):
"比较编码".我们把所有可能的 collation 中最简单的这种叫做binary collation
但是如果我们想让大写字母和小写字母一样怎么办?那么我们就得有两条规则:
(1)把小写字母`a‘ 和 `b‘ 看作跟 `A‘ 和 `B‘相等;
(2)然后比较编码。
我们称这是一个case-insensitive collation(不区分大小写的 collation).
这比binary collation 稍微复杂了一点。
在实际生活中,大多数字符集都包含很多字符:不是仅仅`A‘和`B‘ 而是整个字母表,
有时是多个字母表或者东方书写系统里几千的字符,和很多专有符号和标点符。
并且在实际生活中,大多数的collations 有很多规则:除了不区分大小写外还有不区分
重音(重音``accent‘‘ 是像在德语里字符附加的重音符那样的)和多字符映射。
MySQL 4.1 可以为你做以下事:
·使用各种字符集存储字符串
·使用各种collation比较字符串。
·在同一台服务器上或者同一个数据库甚至同一个表中使用不同的字符集和collation混合
·允许在任何级别上指明字符集和collation
在这些方面,MySQL 4.1 不只远远比MySQL 4.0复杂,也比其他DBMS先进很多。不过要想
有效的使用这些新特性,你需要学习哪些字符集和collation是可用的,怎样把他们改成
默认,还有各种字符串运算符如何操作他们。
10.2 MySQL 里的字符集和Collations
MySQL 服务器可支持多个字符集。要列出可用的字符集,使用 SHOW CHARACTER SET 语句:mysql> SHOW CHARACTER SET;
+----------+-----------------------------+---------------------+
| Charset | Description | Default collation |
+----------+-----------------------------+---------------------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci |
| dec8 | DEC West European | dec8_swedish_ci |
| cp850 | DOS West European | cp850_general_ci |
| hp8 | HP West European | hp8_english_ci |
| koi8r | KOI8-R Relcom Russian | koi8r_general_ci |
| latin1 | ISO 8859-1 West European | latin1_swedish_ci |
| latin2 | ISO 8859-2 Central European | latin2_general_ci |
...
输出实际上包含另一列,这里为了让例子在页面上显示更合适,没显示出来
任一给出的字符集至少包含一个collation. 它可能包含多个 collations.
要列出一个字符集的 collations , 使用 SHOW COLLATION 语句. 例如, 要看latin1
(``ISO-8859-1 West European‘‘)的collations, 使用这个语句来找到哪些名字以latin1
开头的collation
mysql> SHOW COLLATION like ‘latin1%‘;
+-------------------+---------+----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+-------------------+---------+----+---------+----------+---------+
| latin1_german1_ci | latin1 | 5 | | | 0 |
| latin1_swedish_ci | latin1 | 8 | Yes | Yes | 1 |
| latin1_danish_ci | latin1 | 15 | | | 0 |
| latin1_german2_ci | latin1 | 31 | | Yes | 2 |
| latin1_bin | latin1 | 47 | | Yes | 1 |
| latin1_general_ci | latin1 | 48 | | | 0 |
| latin1_general_cs | latin1 | 49 | | | 0 |
| latin1_spanish_ci | latin1 | 94 | | | 0 |
+-------------------+---------+----+---------+----------+---------+
latin1 collations 有下列含义:
Collation 含义
latin1_bin Binary according to latin1 encoding
latin1_danish_ci Danish/Norwegian
latin1_general_ci Multilingual
latin1_general_cs Multilingual, case sensitive