这个问题困扰了我很久,断断续续花了我2天的时间才解决。
一、统一使用一种编码,比如utf8。
1、首先查看数据库编码。
可以看到数据库db默认的charcter set为latin1,因此有必要改成utf8。mysql> show create database db;
+----------+------------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------------+
| db | CREATE DATABASE `db` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+------------------------------------------------------------------+
1 row in set (0.00 sec)
将数据库db的默认编码和字符集分别改为了utf8和utf8_general_ci。utf8_unicode_ci和utf8_general_ci区别:mysql> alter database db default character set utf8 default collate utf8_gene
ral_ci;
Query OK, 1 row affected (0.00 sec)
在数据库系统MySQL中有多种字符集,其中utf8_unicode_ci和utf8_general_ci是最常用的,但是utf8_general_ci对某些语言的支持有一些小问题,如果可以接受,那最好使用utf8_general_ci,因为它速度快。否则,请使用较为精确的utf8_unicode_ci,不过速度会慢一些(维基百科)。
现在再来看是否修改成功:
可以看到已经修改成功了。mysql> show create database db;
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| db | CREATE DATABASE `db` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)
二、修改客户端和服务端字符集
这部分在网络上已经有了:
SET character_set_client = utf8;这里有个建议。因为现在php、asp.net、python...连接mysql都可以进行持久化连接池。因此,只需要在php第一次建立mysql连接后设置上述配置,除非在查询时需要更改用户名或数据库,不然上述配置只须设立一次,即每次建立mysql对象时。所以可以自定义一个mysql类,单例模式,这样可以保证以后的查询都使用上述配置,使查询字符集统一。
SET character_set_connection = utf8;
SET character_set_database = utf8;
SET character_set_results = utf8;
SET character_set_server = utf8;
SET collation_connection = utf8;
SET collation_database = utf8;
SET collation_server = utf8;
三、创立一个存储程序
具体的例子就免了。
我们来个左证。mysql建立的存储程序都存放在mysql.proc表中。打开查看在后面发现三项:
可以看到,character_set_client和collation_connerction、db_collation都已经设置成utf8,这时无论你存储程序或函数里填些什么都不会乱码了。
四、utf8兼容gbk情况
如果在windows dos下,使用“set names utf8"并不会起作用,因为dos这个客户端并不支持utf8,这时可以使用"set names gbk"进行查询存储程序,大部份情况下utf8是兼容gbk的,因此基本上不会出现乱码。