关于MySQL字符集的问题
时间:2008-09-27 来源:gunny
首先要了解字符集和校验的概念,这对理解后文很重要。请查阅手册
可以使用
mysql> SHOW CHARACTER SET;
对字符集进行查看,种类繁多。
可以使用
mysql> SHOW COLLATION LIKE 'latin1%';
对latin1字符集校验进行查看,种类同样很多,都以$1_$2_$3的形式出现,$1为使用的字符集,$2为使用国家,也可能是多国语言general,$3 一般设置为ci,cs,bin。ci是不区分大小写的,cs是大小写敏感的,bin是二原结束
设置字符集和校验分为客户端和服务器端
服务器端的字符集和校验可分为四层,高层服务器字符集和校验,次高层数据库字符集和校验,低层表字符集和校验,最低层列字符集和校验。分别以1,2,3,4代表。
1是在安装时设置好的,如果默认要改变要重新安装,但在启动mysqld的时候可以设置
shell> mysqld --default-character-set=latin1 \
--default-collation=latin1_swedish_ci
同时设置character_set_server和collation_server系统变量的值为上面定义的
2可以在创建时定义,也可以在以后设置
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;
设置character_set_database和collation_database变量的值,如果缺省看看手册就懂了,很简单。下面介绍的也一样
3同上
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]
4同上
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
);
客户端的连接同样要设置字符集和校验,服务器需要知道,你使用的是什么字符集,服务器接到数据后要转换成什么字符集和返回什么字符集,如果需要改变可能会丢失字节。服务器使用character_set_client变量作为客户端发送的查询中使用的字符集。服务器使用character_set_connection和collation_connection系统变量进行转换。character_set_results变量指示服务器返回查询结果到客户端使用的字符集。
可以如下设置客户端字符集
SET NAMES 'charset_name'
SET NAMES 'x'语句与这三个语句等价:
mysql> SET character_set_client = x;
mysql> SET character_set_results = x;
mysql> SET character_set_connection = x;(这就是为啥PHP要设置字符集的原因啦)
一直设置会很烦的,可以在my.ini里增加设置
[mysql]
default-character-set=utf8
在手册上还介绍了在查询时显示的设置字符集和校验character_set_connection 和collation_connection的方法不太常用,提一下,详细看手册吧
SELECT _latin1'string' COLLATE latin1_danish_ci;
这是改变校验的
SELECT K FROM t1 ORDER BY k COLLATE latin1_german2_ci;
mysql提供了用于字符集转换的函数CONVERT(),CAST()
CONVERT(expr USING transcoding_name)
SELECT CONVERT(latin1field USING utf8) FROM latin1table;
CAST(character_string AS character_data_type CHARACTER SET charset_name)
SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;
也为SHOW提供了查看数据库,表和列的字符集的方法
mysql> SHOW CREATE DATABASE databasename;
mysql> SHOW CREATE TABLE tablename;
mysql> SHOW FULL COLUMNS FROM tablename\G;\G看的比较清楚,列不多可以不加啦
上面提供了很多变量可以用SHOW查看
mysql> SHOW VARIABLES LIKE 'character_set_client';
mysql> SHOW VARIABLES LIKE 'character_set_system';这句是查看mysql返回信息的字符集,默认是utf8的
MYSQL 5.1新特性:mysql分配了一直国际特有字符集,其实就是utf8啦,utf8现在是4字节变长,但在mysql他是3字节存的,所有如果用了char(10)就表示要分配30个字节,因为这是最大长度嘛。varchar是变长所以用的字节就少,但有人说char速度快。
新特性就是下面类型声明是等价的:
CHAR(10) CHARACTER SET utf8
NATIONAL CHARACTER(10)
NCHAR(10)
下面同样:
VARCHAR(10) CHARACTER SET utf8
NATIONAL VARCHAR(10)
NCHAR VARCHAR(10)
NATIONAL CHARACTER VARYING(10)
NATIONAL CHAR VARYING(10)
比较方便啦