1)MySQL5.1对字符集支持
1>使用多种字符集来存储字符串
2>使用多种校对规则来比较字符串
3>在同一台服务器、同一个数据库或甚至在同一个表中使用不同字符集或校对规则来混合字符串
4>允许定义任何级别的字符集和校对规则
MySQL服务器能够支持多种字符集
可以使用SHOW CHARACTER SET语句列出可用的字符集:
mysql> SHOW CHARACTER SET
2)字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和连接级。
1>服务器级
在服务器级别,确定方法很简单。当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和 校对规则。 可以使用--default-character-set设置字符集,并且可以在字符集后面为校对规则添加--default-collation。 如果没有指定一个字符集,那就与--default-character-set=latin1相同。
当前的服务器字符集和校对规则可以用作character_set_server和collation_server系统变量的值。在运行时能够改变这些变量的值。
2>数据库级
每一个数据库有一个数据库字符集和一个数据库校对规则,它不能够为空。
CREATE DATABASE和ALTER DATABASE语句有一个可选的子句来指定数据库字符集和校对规则: CREATE DATABASE db_name [[DEFAULT] CHARACTER SET charset_name] [[DEFAULT] COLLATE collation_name]
ALTER DATABASE db_name [[DEFAULT] CHARACTER SET charset_name] [[DEFAULT] COLLATE collation_name] 例如:
CREATE DATABASE db_name DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
MySQL选择数据库字符集和数据库校对规则:
1>如果指定了CHARACTER SET X和COLLATE Y,那么采用字符集X和校对规则Y。
2>如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默认校对规则。
否则,采用服务器字符集和服务器校对规则。
3>表级
如果在CREATE TABLE语句中没有指定表字符集和校对规则,则使用数据库字符集和校对规则作为默认值。
每一个表有一个表字符集和一个校对规则,它不能为空。 为指定表字符集和校对规则,CREATE TABLE 和ALTER TABLE语句有一个可选的子句:
CREATE TABLE tbl_name (column_list) [DEFAULT CHARACTER SET charset_name [COLLATE collation_name]]
ALTER TABLE tbl_name [DEFAULT CHARACTER SET charset_name] [COLLATE collation_name] 例如:
CREATE TABLE t1 ( ... ) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;
MySQL选择表字符集和 校对规则:
1>如果指定了CHARACTER SET X和COLLATE Y,那么采用CHARACTER SET X和COLLATE Y。
2>如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默认校对规则。 否则,使用数据库字符集和校对规则作为默认值。
如果在列定义中没有指定列字符集和校对规则,则默认使用表字符集和校对规则。
每一个"字符"列(即,CHAR、VARCHAR或TEXT类型的列)有一个列字符集和一个列校对规则,它不能为空。列定义语法有一个可选子句来指
定列字符集和校对规则:
col_name {CHAR | VARCHAR | TEXT} (col_length) [CHARACTER SET charset_name [COLLATE collation_name]] 例如:
CREATE TABLE Table1 ( column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci );
MySQL选择列字符集和校对规则:
1>如果指定了CHARACTER SET X和COLLATE Y,那么采用CHARACTER SET X和COLLATE Y。
2>如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默认校对规则。 否则,采用表字符集和服务器校对规则。
示例1:表和列定义
CREATE TABLE t1 ( c1 CHAR(10) CHARACTER SET latin1 COLLATE latin1_german1_ci ) DEFAULT CHARACTER SET latin2 COLLATE latin2_bin; 在这里我们有一个列使用latin1字符集和latin1_german1_ci校对规则。是显式的定义,因此简单明了。需要注意的是,在一个latin2表中存
储一个latin1列不会存在问题。
示例2:表和列定义
CREATE TABLE t1 ( c1 CHAR(10) CHARACTER SET latin1 ) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci; 这次我们有一个列使用latin1字符集和一个默认校对规则。尽管它显得自然,默认校对规则却不是表级。相反,因为latin1的默认校对规则总
是latin1_swedish_ci,列c1有一个校对规则latin1_swedish_ci(而不是latin1_danish_ci)。
示例3:表和列定义
CREATE TABLE t1 ( c1 CHAR(10) ) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci; 我们有一个列使用一个默认字符集和一个默认校对规则。在这种情况下,MySQL查找表级别来确定列字符集和 校对规则。因此,列c1的字符集
是latin1,它的 校对规则是latin1_danish_ci。
示例4:数据库、表和列定义
CREATE DATABASE d1 DEFAULT CHARACTER SET latin2 COLLATE latin2_czech_ci; USE d1; CREATE TABLE t1 ( c1 CHAR(10) ); 我们创建了一个没有指定字符集和校对规则的列。我们也没有指定表级字符集和校对规则。在这种情况下,MySQL查找数据库级的相关设置。
(数据库的设置变为表的设置,其后变为列的设置。)因此,列c1的字符集为是latin2,它的 校对规则是latin2_czech_ci。
4>连接级
一些字符集和校对规则系统变量与客户端和服务器的交互有关。
服务器字符集和校对规则表示为character_set_server和collation_server变量的值。
默认数据库的字符集和校对规则表示为character_set_database和collation_database变量的值。
考虑什么是一个"连接":它是连接服务器时所作的事情。客户端发送SQL语句,例如查询,通过连接发送到服务器。服务器通过连接发送
响应给客户端,例如结果集。对于客户端连接,这样会导致一些关于连接的字符集和校对规则的问题,这些问题均能够通过系统变量来解决.
1>当查询离开客户端后,在查询中使用哪种字符集? 答:服务器使用character_set_client变量作为客户端发送的查询中使用的字符集。
2>服务器接收到查询后应该转换为哪种字符集? 答:转换时,服务器使用character_set_connection和collation_connection系统变量。 它将客户端发送的查询从character_set_client系统变量转换到character_set_connection
3>服务器发送结果集或返回错误信息到客户端之前应该转换为哪种字符集? 答:character_set_results变量指示服务器返回查询结果到客户端使用的字符集。包括结果数据,例如列值和结果元数据(如列名)。
有两个语句影响连接字符集: SET NAMES 'charset_name' SET CHARACTER SET charset_name SET NAMES显示客户端发送的SQL语句中使用什么字符集。
SET NAMES 'x'语句与这三个语句等价: mysql> SET character_set_client = x; mysql> SET character_set_results = x; mysql> SET character_set_connection = x;