MySQL(4.1以后版本) 服务器中有六个关键位置使用了字符集的概念,他们是:client 、connection、database、results、server 、system。MySQL有两个字符集概念:一个就是字符集本身,一个是字符集校验规则。字符集影响数据在传输和存储过程中的处理方式,而字符集校验则影响ORDER BY和GROUP BY这些排序方式。
1.和存储有关的
服务器字符集 (@@character_set_server)
库字符集 (@@character_set_database)
表字符集
字段字符集
character_set_server: 服务器安装时指定的默认字符集设定。
character_set_database: 数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。
character_system: 数据库系统使用的字符集设定。
在创建一个表的时候,每个字段只要不是binary,都会有一个字符集。如果不指定,那么在SHOW CREATE TABLE的时候,它是不会显示出来的。
建表时候,字段字符集的选取方式如下:
* if 字段指定的字符集
* else if 表指定的字符集
* else if @@character_set_database
* else @@character_set_server (如果没有设定,这个值为latin1)
2.和传输有关的
@@character_set_connection
@@character_set_results
@@character_set_client
character_set_connection: 连接数据库的字符集设置类型,如果php没有指明连接数据库使用的字符集类型就按照服务器端默认的字符设置
character_set_results: 数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集
character_set_client: 客户端使用的字符集,相当于网页中的字符集设置
3.字符集的校对规则
字符集的校对规则设定分别由上面的character_set_connection, character_set_database, character_set_server决定
collation_connection: 连接字符集的校对规则
collation_database: 默认数据库使用的校对规则。当默认数据库改变时服务器则设置该变量。如果没有默认数据库,变量的值同collation_server
collation_server: 服务器的默认校对规则
以上内容中character_set_client, character_set_connection, character_set_results 受客户端默认字符集影响,其中php编译mysql模块时的默认字符集同样也受到它链接的mysql动态库影响,从而影响到php的character_set_connection, character_set_client设定。当默认字符集不是utf8时,设置my.cnf
[mysqld]
default-character-set=utf8
default-collation=utf8_general_ci
default-character-set只能改变对存储层(server,database,table,column,system)的设定,对于客户端和服务器端的通讯层没有任何影响。
mysql> SHOW VARIABLES LIKE ‘character_set_%’;
+————————–+—————————————————————————+
| Variable_name | Value |
+————————–+—————————————————————————+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8
解决字符集通讯设置不匹配的方法:
(修改默认的character_set_client,character_set_connection,character_set_result)
1. 重新编译mysql和php,mysql加入编译参数 –default-character-set=utf8
2. PHP程序在查询数据库之前,执行mysql_query(”set names utf8;”);
3.修改my.cnf,在[mysqld]中加入init-connect=”set names utf8” (对于超级用户连接该选项无效)
4. 启动mysqld 加入参数 –skip-character-set-client-handshake忽略客户端字符集
【步骤】
1.进入MySQL Command Line Client;
2.命令:
mysql> show variables like 'character%';
+--------------------------+---------------------------------------------------------+
| Variable_name | Value
|
+--------------------------+---------------------------------------------------------+
| character_set_client | latin1
|
| character_set_connection | latin1
|
| character_set_database | latin1
|
| character_set_filesystem | binary
|
| character_set_results | latin1
|
| character_set_server | latin1
|
| character_set_system | utf8
|
| character_sets_dir | C:/Program Files/MySQL/MySQL Server 5.1/share/charsets/ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.00 sec)
mysql> set names 'gbk';
Query OK, 0 rows affected (0.02 sec)
mysql> show variables like 'character%';
+--------------------------+---------------------------------------------------------+
| Variable_name | Value
|
+--------------------------+---------------------------------------------------------+
| character_set_client | gbk
|
| character_set_connection | gbk
|
| character_set_database | latin1
|
| character_set_filesystem | binary
|
| character_set_results | gbk
|
| character_set_server | latin1
|
| character_set_system | utf8
|
| character_sets_dir | C:/Program Files/MySQL/MySQL Server 5.1/share/charsets/ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.00 sec)
它相当于下面三条命令:
SET character_set_client = gbk;
SET character_set_results = gbk;
SET character_set_connection = gbk;
其它的五项也可以分别设置。
MySQL对字符集的支持包含两个方面:
一是字符集(character set);二是排序方式(collation)
mysql> show variables like 'character_set_%';
+--------------------------+---------------------------------------------------------+
| Variable_name | Value
|
+--------------------------+---------------------------------------------------------+
| character_set_client | gbk
|
| character_set_connection | gbk
|
| character_set_database | latin1
|
| character_set_filesystem | binary
|
| character_set_results | gbk
|
| character_set_server | latin1
|
| character_set_system | utf8
|
| character_sets_dir | C:/Program Files/MySQL/MySQL Server 5.1/share/charsets/ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.01 sec)
mysql> show variables like 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | gbk_chinese_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)
修改表的字符集:
mysqls>alter table UserInfo default charset gbk;
还可以用:
alter TableName chang 'FieldName','FieldName'...
修改列字符集。
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,在同壹個數據列里混用不同的字符集。
各级字符集的查询方法
-
服务器级
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)。