mysql> 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/local/workspace/mysql/share/mysql/charsets/ |
+--------------------------+--------------------------------------------------+
8 rows in set (0.00 sec)
mysql>
可以看到,我的这几个变量都是一致的。但如果不一致呢
?网上许多教程告诉你“你 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_client,character_set_connection 与 character_set_database 一致。
2 、 要 保 证 数 据 库 中 存 储 的 数 据 与 数 据 库 编 码 一 致 , 即 数 据 的 编 码 与