MySql字符编码

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。

1、需要以root用户身份登陆才可以查看数据库编码方式(以root用户身份登陆的命令为:>mysql -u root –p,之后两次输入root用户的密码),查看数据库的编码方式命令为:
>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的服务。
(2) (2) 还有一种修改字符集的方法,就是使用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/ |
+--------------------------+----------------------------+
 可以看到,这几个变量都是一致的。但如果不一致呢?
网上许多教程告诉你“你set names下就解决了”。那么set names是什么呢? set names实际上就是同时设置了character_set_client,character_set_connection,character_set_results这三个系统变量。

例如在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语句列出可用的字符集:
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;
 
 

猜你喜欢

转载自dongruan00.iteye.com/blog/1772987
今日推荐