MySQL4.1及以上版本的字符集支持(CharacterSetSupport)有两个方面:
字符集(CharacterSet)和校对规则(Collation)。
字符集和校对规则有4个级别的默认设置:服务器(server),数据库(database),数据表(table)和连接(connection)。
MySQL中是根据下面几个变量确定服务器端和客户端用的什么字符集:
character_set_client 客户端字符集
character_set_connection 客户端与服务器端连接采用的字符集
character_set_results SELECT查询返回数据的字符集
character_set_database 数据库采用的字符集
MySQL的字符集处理是这样的:
1、发送请求。
1)客户端发送请求到服务器端。
2)服务器端会把请求的数据从客户端字符集(character_set_client)转成服务器连接字符集(character_set_connection)。
3)然後服务器会检测存储区域(table,column)的字符集,然后把数据从连接字符集(character_set_connection)转为存储区域(table,column)的字符集,然後再存储或者查询。
2、返回请求。
1)服务器将存储区域(table,column)的字符集转换成服务器连接字符集(character_set_connection)。
2)将服务器连接字符集(character_set_connection)转换成结果字符集(character_set_results),再发送到客户端。
MySQL的默认编码是Latin1,不支持中文,要支持中午需要把数据库的默认编码修改为gbk或者utf8。
>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 | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+
mysql> show variables like 'collation_%'; +----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_general_ci | | collation_database | utf8_general_ci | | collation_server | utf8_general_ci | +----------------------+-----------------+修改默认字符集
(1) 最简单的修改方法,就是修改mysql的my.ini文件中的字符集键值,
如 default-character-set = utf8 修改完后,重启mysql的服务。
mysql> SET character_set_client = utf8 ;
>show variables like 'character%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+可以看到,这几个变量都是一致的。但如果不一致呢?
例如在mysql命令行上输入 set names 'gbk' 命令等同于:
SET character_set_client = gbk; SET character_set_connection = gbk; SET character_set_results = gbk;
很多情况下,这样设置了之后就能把乱码问题解决了。但是还是不能完全避免出现乱码的可能,为什么呢?
因为character_set_client,character_set_connection这两个变量仅用于保证与character_set_database编码的一致,而character_set_results则用与保证SELECT返回的结果与程序的编码一致。
例如,你的数据库(character_set_database)用的是utf8的字符集,那么你就要保证character_set_client,character_set_connection也是utf8的字符集。
而你的程序也许采用的并不是utf8,比如你的程序用的是gbk,那么你若把character_set_results也设置为utf8的话就会出现乱码问题。此时你应该把character_set_results设置为gbk。这样就能保证数据库返回的结果与你的程序的编码一致。
1、要保证数据库中存的数据与数据库编码一致,即数据编码与character_set_database一致。
2、要保证通讯的字符集与数据库的字符集一致,即character_set_client,character_set_connection与character_set_database一致。
3、要保证SELECT的返回与程序的编码一致,即character_set_results与程序编码一致。
4、要保证程序编码与浏览器编码一致,即程序编码与<meta http-equiv="Content-Type" content="text/html; charset=?" />一致。
mysql> show character set;创建数据库时指定编码的两种方式:
CREATE DATABASE ms_db CHARACTER SET utf8 COLLATE utf8_general_ci; create database if not exists netctoss default character set utf8;修改数据库的字符集
mysql>use mydb mysql>alter database mydb character set utf-8;