第10章字符集支持.docx
- 文档编号:25435590
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:44
- 大小:38.24KB
第10章字符集支持.docx
《第10章字符集支持.docx》由会员分享,可在线阅读,更多相关《第10章字符集支持.docx(44页珍藏版)》请在冰豆网上搜索。
第10章字符集支持
第10章:
字符集支持
目录
10.1.常规字符集和校对
10.2.MySQL中的字符集和校对
10.3.确定默认字符集和校对
10.3.1.服务器字符集和校对
10.3.2.数据库字符集和校对
10.3.3.表字符集和校对
10.3.4.列字符集和校对
10.3.5.字符集和校对分配示例
10.3.6.连接字符集和校对
10.3.7.字符串文字字符集和校对
10.3.8.在SQL语句中使用COLLATE
10.3.9.COLLATE子句优先
10.3.10.BINARY操作符
10.3.11.校对确定较为复杂的一些特殊情况
10.3.12.校对必须适合字符集
10.3.13.校对效果的示例
10.4.字符集支持影响到的操作
10.4.1.结果字符串
10.4.2.CONVERT()
10.4.3.CAST()
10.4.4.SHOW语句
10.5.Unicode支持
10.6.用于元数据的UTF8
10.7.与其它DBMS的兼容性
10.8.新字符集配置文件格式
10.9.国家特有字符集
10.10.MySQL支持的字符集和校对
10.10.1.Unicode字符集
10.10.2.西欧字符集
10.10.3.中欧字符集
10.10.4.南欧与中东字符集
10.10.5.波罗的海字符集
10.10.6.西里尔字符集
10.10.7.亚洲字符集
本章讨论以下主题:
· 什么是字符集和校对规则?
· 多级默认系统
· 字符集语法
· 相关函数和运算
· Unicode支持
· 每个字符集和校对规则的含义
MySQL5.1中的字符集支持包括在MyISAM、MEMORY和InnoDB存储引擎中。
10.1. 常规字符集和校对
字符集是一套符号和编码。
校对规则是在字符集内用于比较字符的一套规则。
让我们使用一个假想字符集的例子来区别清楚。
假设我们有一个字母表使用了四个字母:
‘A’、‘B’、‘a’、‘b’。
我们为每个字母赋予一个数值:
‘A’=0,‘B’=1,‘a’=2,‘b’=3。
字母‘A’是一个符号,数字0是‘A’的编码,这四个字母和它们的编码组合在一起是一个字符集。
假设我们希望比较两个字符串的值:
‘A’和‘B’。
比较的最简单的方法是查找编码:
‘A’为0,‘B’为1。
因为0小于1,我们可以说‘A’小于‘B’。
我们做的仅仅是在我们的字符集上应用了一个校对规则。
校对规则是一套规则(在这种情况下仅仅是一套规则):
“对编码进行比较。
”我们称这种全部可能的规则中的最简单的校对规则为一个binary(二元)校对规则。
但是,如果我们希望小写字母和大写字母是等价的,应该怎样?
那么,我们将至少有两个规则:
(1)把小写字母‘a’和‘b’视为与‘A’和‘B’等价;
(2)然后比较编码。
我们称这是一个大小写不敏感的校对规则。
比二元校对规则复杂一些。
在实际生活中,大多数字符集有许多字符:
不仅仅是‘A’和‘B’,而是整个字母表,有时候有许多种字母表,或者一个东方的使用上千个字符的书写系统,还有许多特殊符号和标点符号。
并且在实际生活中,大多数校对规则有许多个规则:
不仅仅是大小写不敏感,还包括重音符不敏感(“重音符”是附属于一个字母的符号,象德语的‘Ö’符号)和多字节映射(例如,作为规则‘Ö’=‘OE’就是两个德语校对规则的一种)。
MySQL5.1能够做这些事情:
· 使用多种字符集来存储字符串
· 使用多种校对规则来比较字符串
· 在同一台服务器、同一个数据库或甚至在同一个表中使用不同字符集或校对规则来混合字符串
· 允许定义任何级别的字符集和校对规则
在这些方面,MySQL5.1不仅比MySQL4.1以前的版本灵活得多,而且比其它大多数数据库管理系统超前许多。
但是,为了有效地使用这些功能,你需要了解哪些字符集和校对规则是可用的,怎样改变默认值,以及它们怎样影响字符操作符和字符串函数的行为。
10.2. MySQL中的字符集和校对
MySQL服务器能够支持多种字符集。
可以使用SHOWCHARACTERSET语句列出可用的字符集:
mysql>SHOWCHARACTERSET;
+----------+-----------------------------+---------------------+--------+
|Charset |Description |Defaultcollation |Maxlen|
+----------+-----------------------------+---------------------+--------+
|big5 |Big5TraditionalChinese |big5_chinese_ci | 2|
|dec8 |DECWestEuropean |dec8_swedish_ci | 1|
|cp850 |DOSWestEuropean |cp850_general_ci | 1|
|hp8 |HPWestEuropean |hp8_english_ci | 1|
|koi8r |KOI8-RRelcomRussian |koi8r_general_ci | 1|
|latin1 |cp1252 WestEuropean |latin1_swedish_ci | 1|
|latin2 |ISO8859-2CentralEuropean|latin2_general_ci | 1|
|swe7 |7bitSwedish |swe7_swedish_ci | 1|
|ascii |USASCII |ascii_general_ci | 1|
|ujis |EUC-JPJapanese |ujis_japanese_ci | 3|
|sjis |Shift-JISJapanese |sjis_japanese_ci | 2|
|hebrew |ISO8859-8Hebrew |hebrew_general_ci | 1|
|tis620 |TIS620Thai |tis620_thai_ci | 1|
|euckr |EUC-KRKorean |euckr_korean_ci | 2|
|koi8u |KOI8-UUkrainian |koi8u_general_ci | 1|
|gb2312 |GB2312SimplifiedChinese |gb2312_chinese_ci | 2|
|greek |ISO8859-7Greek |greek_general_ci | 1|
|cp1250 |WindowsCentralEuropean |cp1250_general_ci | 1|
|gbk |GBKSimplifiedChinese |gbk_chinese_ci | 2|
|latin5 |ISO8859-9Turkish |latin5_turkish_ci | 1|
...
(完整列表参见10.10节,“MySQL支持的字符集和校对”。
)
任何一个给定的字符集至少有一个校对规则。
它可能有几个校对规则。
要想列出一个字符集的校对规则,使用SHOWCOLLATION语句。
例如,要想查看latin1(“西欧ISO-8859-1”)字符集的校对规则,使用下面的语句查找那些名字以latin1开头的校对规则:
mysql>SHOWCOLLATIONLIKE'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校对规则有下面的含义:
校对规则
含义
latin1_german1_ci
德国DIN-1
latin1_swedish_ci
瑞典/芬兰
latin1_danish_ci
丹麦/挪威
latin1_german2_ci
德国DIN-2
latin1_bin
符合latin1编码的二进制
latin1_general_ci
多种语言(西欧)
latin1_general_cs
多种语言(西欧ISO),大小写敏感
latin1_spanish_ci
现代西班牙
校对规则一般有这些特征:
· 两个不同的字符集不能有相同的校对规则。
· 每个字符集有一个默认校对规则。
例如,latin1默认校对规则是latin1_swedish_ci。
· 存在校对规则命名约定:
它们以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束。
10.3. 确定默认字符集和校对
10.3.1.服务器字符集和校对
10.3.2.数据库字符集和校对
10.3.3.表字符集和校对
10.3.4.列字符集和校对
10.3.5.字符集和校对分配示例
10.3.6.连接字符集和校对
10.3.7.字符串文字字符集和校对
10.3.8.在SQL语句中使用COLLATE
10.3.9.COLLATE子句优先
10.3.10.BINARY操作符
10.3.11.校对确定较为复杂的一些特殊情况
10.3.12.校对必须适合字符集
10.3.13.校对效果的示例
字符集和校对规则有4个级别的默认设置:
服务器级、数据库级、表级和连接级。
以下描述可能显得复杂,但是在实际应用中可以发现使用多种级别会使结果自然而明显。
10.3.1. 服务器字符集和校对
MySQL服务器有一个服务器字符集和一个服务器校对规则,它们均不能设置为空。
MySQL按照如下方法确定服务器字符集和服务器校对规则:
· 当服务器启动时根据有效的选项设置
· 根据运行时的设定值
在服务器级别,确定方法很简单。
当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和校对规则。
可以使用--default-character-set设置字符集,并且可以在字符集后面为校对规则添加--default-collation。
如果没有指定一个字符集,那就与--default-character-set=latin1相同。
如果你仅指定了一个字符集(例如,latin1),但是没有指定一个校对规则,那就与--default-charset=latin1--default-collation=latin1_swedish_ci相同,因为latin1_swedish_ci是latin1的默认校对规则。
因此,以下三个命令有相同的效果:
shell>mysqld
shell>mysqld--default-character-set=latin1
shell>mysqld--default-character-set=latin1\
--default-collation=latin1_swedish_ci
更改设定值的一个方法是通过重新编译。
如果希望在从源程序构建时更改默认服务器字符集和校对规则,使用:
--with-charset和--with-collation作为configure的参量。
例如:
shell>./configure--with-charset=latin1
或者:
shell>./configure--with-charset=latin1\
--with-collation=latin1_german1_ci
mysqld和configure都验证字符集/校对规则组合是否有效。
如果无效,每个程序都显示一个错误信息,然后终止。
当前的服务器字符集和校对规则可以用作character_set_server和collation_server系统变量的值。
在运行时能够改变这些变量的值。
10.3.2. 数据库字符集和校对
每一个数据库有一个数据库字符集和一个数据库校对规则,它不能够为空。
CREATEDATABASE和ALTERDATABASE语句有一个可选的子句来指定数据库字符集和校对规则:
CREATEDATABASEdb_name
[[DEFAULT]CHARACTERSETcharset_name]
[[DEFAULT]COLLATEcollation_name]
ALTERDATABASEdb_name
[[DEFAULT]CHARACTERSETcharset_name]
[[DEFAULT]COLLATEcollation_name]
例如:
CREATEDATABASEdb_name
DEFAULTCHARACTERSETlatin1COLLATElatin1_swedish_ci;
MySQL这样选择数据库字符集和数据库校对规则:
· 如果指定了CHARACTERSETX和COLLATEY,那么采用字符集X和校对规则Y。
· 如果指定了CHARACTERSETX而没有指定COLLATEY,那么采用CHARACTERSETX和CHARACTERSETX的默认校对规则。
· 否则,采用服务器字符集和服务器校对规则。
MySQL的CREATEDATABASE...DEFAULTCHARACTERSET...语法与标准SQL的CREATESCHEMA...CHARACTERSET...语法类似。
因此,可以在同一个MySQL服务器上创建使用不同字符集和校对规则的数据库。
如果在CREATETABLE语句中没有指定表字符集和校对规则,则使用数据库字符集和校对规则作为默认值。
它们没有其它目的。
默认数据库的字符集和校对规则可以用作character_set_database和collation_database系统变量。
无论何时默认数据库更改了,服务器都设置这两个变量的值。
如果没有默认数据库,这两个变量与相应的服务器级别的变量(character_set_server和collation_server)具有相同的值。
10.3.3. 表字符集和校对
每一个表有一个表字符集和一个校对规则,它不能为空。
为指定表字符集和校对规则,CREATETABLE和ALTERTABLE语句有一个可选的子句:
CREATETABLEtbl_name(column_list)
[DEFAULTCHARACTERSETcharset_name[COLLATEcollation_name]]
ALTERTABLEtbl_name
[DEFAULTCHARACTERSETcharset_name][COLLATEcollation_name]
例如:
CREATETABLEt1(...)
DEFAULTCHARACTERSETlatin1COLLATElatin1_danish_ci;
MySQL按照下面的方式选择表字符集和校对规则:
· 如果指定了CHARACTERSETX和COLLATEY,那么采用CHARACTERSETX和COLLATEY。
· 如果指定了CHARACTERSETX而没有指定COLLATEY,那么采用CHARACTERSETX和CHARACTERSETX的默认校对规则。
· 否则,采用服务器字符集和服务器校对规则。
如果在列定义中没有指定列字符集和校对规则,则默认使用表字符集和校对规则。
表字符集和校对规则是MySQL的扩展;在标准SQL中没有。
10.3.4. 列字符集和校对
每一个“字符”列(即,CHAR、VARCHAR或TEXT类型的列)有一个列字符集和一个列校对规则,它不能为空。
列定义语法有一个可选子句来指定列字符集和校对规则:
col_name{CHAR|VARCHAR|TEXT}(col_length)
[CHARACTERSETcharset_name[COLLATEcollation_name]]
例如:
CREATETABLETable1
(
column1VARCHAR(5)CHARACTERSETlatin1COLLATElatin1_german1_ci
);
MySQL按照下面的方式选择列字符集和校对规则:
· 如果指定了CHARACTERSETX和COLLATEY,那么采用CHARACTERSETX和COLLATEY。
· 如果指定了CHARACTERSETX而没有指定COLLATEY,那么采用CHARACTERSETX和CHARACTERSETX的默认校对规则。
· 否则,采用表字符集和服务器校对规则。
CHARACTERSET和COLLATE子句是标准的SQL。
10.3.5. 字符集和校对分配示例
以下例子显示了MySQL怎样确定默认字符集和校对规则。
示例1:
表和列定义
CREATETABLEt1
(
c1CHAR(10)CHARACTERSETlatin1COLLATElatin1_german1_ci
)DEFAULTCHARACTERSETlatin2COLLATElatin2_bin;
在这里我们有一个列使用latin1字符集和latin1_german1_ci校对规则。
是显式的定义,因此简单明了。
需要注意的是,在一个latin2表中存储一个latin1列不会存在问题。
示例2:
表和列定义
CREATETABLEt1
(
c1CHAR(10)CHARACTERSETlatin1
)DEFAULTCHARACTERSETlatin1COLLATElatin1_danish_ci;
这次我们有一个列使用latin1字符集和一个默认校对规则。
尽管它显得自然,默认校对规则却不是表级。
相反,因为latin1的默认校对规则总是latin1_swedish_ci,列c1有一个校对规则latin1_swedish_ci(而不是latin1_danish_ci)。
示例3:
表和列定义
CREATETABLEt1
(
c1CHAR(10)
)DEFAULTCHARACTERSETlatin1COLLATElatin1_danish_ci;
我们有一个列使用一个默认字符集和一个默认校对规则。
在这种情况下,MySQL查找表级别来确定列字符集和校对规则。
因此,列c1的字符集是latin1,它的校对规则是latin1_danish_ci。
示例4:
数据库、表和列定义
CREATEDATABASEd1
DEFAULTCHARACTERSETlatin2COLLATElatin2_czech_ci;
USEd1;
CREATETABLEt1
(
c1CHAR(10)
);
我们创建了一个没有指定字符集和校对规则的列。
我们也没有指定表级字符集和校对规则。
在这种情况下,MySQL查找数据库级的相关设置。
(数据库的设置变为表的设置,其后变为列的设置。
)因此,列c1的字符集为是latin2,它的校对规则是latin2_czech_ci。
10.3.6. 连接字符集和校对
一些字符集和校对规则系统变量与客户端和服务器的交互有关。
在前面的章节中已经提到过部分内容:
· 服务器字符集和校对规则可以用作character_set_server和collation_server变量的值。
· 默认数据库的字符集和校对规则可以用作character_set_databas
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 字符集 支持