MYSQL教程:MYSQL字符集支持
MySQL4.1以前版本服务器只能使用单一字符集,从MySQL4.1版本开始,不仅服务器能够使用多种字符集,而且在服务器、数据库、数据表、数据列以及字符串常数多个级别上设置不同的字符集。
1.4.1. MySQL4.1以前版本
MySQL4.1以前版本的字符集由服务器默认指定,默认值是编译系统时指定的字符集,该字符集也可通过在启动服务器时指定--default-character-set来修改。这种修改会对数据表的索引造成影响,因为索引的顺序是和字符集有关的,修改字符集会使这个已排序的顺序产生错误。要解决该问题,我们要用修改后的字符集的排序顺序重建表的索引。重建索引有以下几种方法:
-
用mysqldump导出数据,再清除表里的内容,最后用导出文件重新导入。数据表的索引将在导入数时重建。该方法适用于所有数据表类型。
-
删除索引,然后重建。用alter table命令或drop index和create index命令来完成。该方法也适用于所有数据表类型。但该方法需要我们了解重建索引的精确定义。
-
MyISAM数据表的索引可以用myisamchk程序的--recover和--quick选项加上一个用来设定新字符集的--set-character-set选项进行重建。还可以用mysqlcheck程序的--repair和--quick选项或者一个带QUICK选项的REPLACE TABLE语句来重建索引,这种方式较方便。
1.4.2. MySQL4.1以后版本
MySQL4.1以后的版本对字符集的支持好了很多,具有以下新增功能:
-
支持服务器同时使用多种字符集。
-
允许在服务器,数据库,数据表,数据列等多级别上设置不同的字符集。
-
服务器的默认字符集在编译时选定,但可在启动服务器时用--default-character-set选项来更改。
-
用ALTER DATABASE db_name DEFAULT CHARACTER SET charset来设置数据库字符集。 如果只有default参数,则使用服务器的字符集。
-
用CREATE TABLE table_name(...) CHARACTER SET = charset设置数据表字符集。如果charset为default,则使用数据表所在数据库的字符集作为数据表的字符集。
-
在数据列中,可用CHARACTER SET charset属性来设置数据列的字符集。charset不能是default,如果没有该属性,则默认使用数据表的字符集。允许设置字符集的数据列有char,varchar(不带binary属性)及TEXT类型。
-
用_charset str转换字符串常数的字符集。如:_utf8 'mysql',_latinl 'oracle'。该方法只适用于括在引号内的字符串,其它十六进制常数 、字符串表达式等可用CONVERT()函数进行转换,如:SELECT CONVERT( str USING charset)。
-
-
通过MySQL提供的函数可进行字符集转换和查询。
-
新增的COLLATE操作符使我们可按某一种字符集的排序顺序来处理另一种字符集的数据。如:SELECT a from t ORDER BY a COLLATE utf-8;
-
用SHOW CHARACTER SET命令可显示服务器支持的字符集列表。
-
当服务器转换到另一种字符集时,会自动对索引进行重新排序。
-
通过UTF-8和UCS2字符集提供了Unicode支持。
MySQL现在还不支持:1,在同一个字符串里混用不同字符集的字符;2,在同一个数据列里混用不同的字符集。
1.4.3. 各级字符集的查询方法
-
服务器级
SHOW CHARACTER SET;可查出可供使用的所有字符集。 SHOW VARIABLES LIKE 'character_set';可查出服务器的默认字符集。
-
可查出数据库级的字符集。
SHOW CREATE DATABASE db_name;
-
两条命令可查出数据表的字符集。
SHOW CREATE TABLE table_name; SHOW TABLE STATUS LIKE 'table_name'
-
以下几命令可查出数据列的字符集:
DESCRIBE table_name; SHOW COLUMNS FROM table_name; SHOW CREATE TABLE table_name;
-
用CHARSET()函数可确定特定字符串,字符串表达式或数据列值相关联的字符串的字符集。如:SELECT CHARSET(str)。
1.4.4. Unicode支持
MySQL提供两种字符集来支持Unicode。一个是UTF-8,一种可变长的编码格式,需用1至4个字节来表示一个字符;另一个是UCS2,该字符集中的每个字符需要用两个字节来表示。