首先给出了字符集和校验的概念,这对理解后文很重要。》》查阅手册
可以使用
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 FORM columnsname/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)
比较方便啦