使用mysql数据库,中文乱码,在网上搜索了资料,修改了my.ini文件:default-character-set=utf8,创建数据库、表、
字段的编码都为utf8;SHOW VARIABLES LIKE 'character%':
命令行下插入中文数据,报错。通过mysql GUI插入中文数据,而查询出来的结果乱码;不知道为什么!
既然utf8乱码了,就 set nams gbk; set character_set_database=gbk;
中文插入和查询正确。
下面是几个变量的含义:
character_set_client:客户端字符集;
character_set_connection:客户端与服务器连接采用的字符集;
character_set_results:SELECT查询返回数据的字符集;
character_set_database:数据库采用的字符集;
character_set_client, character_set_connection 这两个变量用于保证与character_set_database编码的一致,而character_set_results则用于保证SELECT返回的结果与程序的编码一致。
Mysql字符集处理流程是这样的:
1、发送请求
(1)客户端发送请求到服务区端。
(2)服务器端把请求的数据从客户端字符集(character_set_client)转成服务器连接字符集(character_set_connect)转位存取区域(table,column)的字符集,然后在存取或查询
2、返回请求
(1)服务器将存储区域(table,column)的字符集转换成服务器连接字符集(character_set_connect)
(2)将服务器连接字符集(character_set_connect)转换成结果字符集(character_set_results),再发送到客户端。
所以:
1、一般情况下当上面几个变量采用一致的字符集,就不会出现乱码;
2、要保证发送的数据与数据库的字符集一致,即 character_set_client,character_set_connection 与character_set_database 一致。
3、要保证数据库中存储的数据与数据库编码一致,即数据的编码(table、column)与character_set_database一致。
4、要保证 SELECT 的返回与程序的编码一致,即 character_set_results 与程序(PHP、Java等)编码一致。
5、要保证程序编码与浏览器编码一致,即程序编码与 一致。
按照这样的规则的话,那么用utf8应该是没错的,但是却出错???
事实上这样设置的话只在控制台乱码,从数据库中读出后显示在页面上是没有错的。
注:以上资料大多来自 http://www.oklinux.cn/html/sql/mysql/20090227/67808.html,记录为学习笔记之用。