修复一下MySQL的编码问题
2016-02-20
数据库的编码问题
中文编码确实是非常蛋疼的一件事。
在数据库里尤甚。MySQL的默认字符串集是拉丁语,真是~~
而且,在MySQL数据库中,没有UTF-8,也没有utf-8,而是utf8.
现在在我的电脑里的MySQL无法存入中文,类似于这样。
我在数据库的表选项的编码格式里面也选择了utf8_general_ci
然而还是没有什么用。
在数据从PHP传到数据库的时候还专门做了转码utf-8,然而还是传不进来。
后经高人指点,在MySQL控制台内输入show variables like "%character%";
即可看到整个数据库的编码格式。
- 第一行表示MySQL客户端的编码格式GBK
- 第二行表示MySQL连接时的编码格式GBK
- 第三行表示数据库拉丁语编码格式
- 第四行表示文件存储编码格式二进制
- 第五行表示显示结果的编码格式GBK
- 第六行表示数据库服务器端的拉丁语编码格式
- 第七行表示数据库所在系统的编码格式utf-8。
除了文件存储格式二进制是对的和数据库所在的系统的编码格式,其他都是错误的吖!
正确的应该是这个样子的。
+--------------------------+----------------------------+
| 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的test
的数据库的baoweichu
表单的编码格式。
先用use test;
找到那个数据库,然后show create table baoweichu;
。
就可以看到,是这个样子的。
虽然下面的那个地方是写的utf-8的编码格式,不过上面的不对,在表单里面的存储编码格式还是拉丁语编码。
正确的编码格式应该是这个样子的。
所以只有把所有的编码格式都正确了之后,才能够在数据库里写上正确的中文。
utf8
,utf-8
与UTF-8
不是同一个意思,/(ㄒoㄒ)/~~在MySQL里是utf8
至于我们为什么要把编码格式都改成utf-8,因为utf-8是能够存储更多的字符,,包括全球所有的语言,是大势所趋。而GBK是中国的标准,不仅支持的汉字数量远不足utf-8,而且在几种GBK的编码方式中相互都不兼容,虽然目前的Windows操作系统中中文的默认编码格式是GBK,但是GBK编码的很多缺点已经越来越明显。
在现在的发展中,
utf8
也要渐渐被utf8mb4
所取代,因为后者所占的字节更大,可以表示的内容也更多,如 emoji。
修复数据库编码问题
Linux
我是在Ubuntu下装的MySQL,使用SHOW VARIABLES LIKE ‘%character%’;
后查看的结果是这样。
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
可以看到除了前面的两个是utf8与我之前在Windows下不同之外,其他的有问题的地方与在Windows下是一样的,因为Linux下没有GBK编码,默认编码格式即utf-8,所以比Windows的情况好一点。
解决办法
- 修改mysql的my.cnf文件中的字符集键值
sudo vim /etc/mysql/my.cnf
- 在
[client]
字段中加入default-character-set=utf8
- 在
[mysqld]
字段张加入character-set-server=utf8
- 在
[mysql]
字段中加入default-character-set=utf8
(注意,一个是mysql,一个是mysqld)
- 在
- 然后再重启MySQL就可以了,但是我的MySQL在这里重启的时候出了一点问题,没有办法关掉。我就把系统重启了一下,再次进入MySQL就可以看到数据库编码已经完全恢复了正常。
- 如果还有问题,那就是在连接的时候出了问题,在sql语句执行的最前面加上这句代码
SET NAMES 'utf8';
,它相当于一下三条代码。
SET character_set_client = utf8; SET character_set_results = utf8; SET character_set_connection = utf8;
Windows
我也在Windows下安装了MySQL,中文编码问题非常严重,在网上找的教程有一点的问题,最终解决了。
一开始我的数据库编码是这样的。
简直惨不忍睹,各种编码格式,在网上找了教程步骤也是跟上面的一样,分别在三个地方加上设定默认编码格式就好了。 但是我的my.ini的内容是这样的,根本就没有那些字段。
解决办法
- 那我们先自己加上一个字段
[client]
,并在这个的下一行加上default-character-set = utf8
,保存看一下结果。当然,先重启MySQL。
此时我的my.ini
是这个样子的。
此时我的MySQL是这个样子的。
太棒了,多了俩utf8。 - 那我们在
my.ini
里面再加上一个字段[mysql]
,并在这个的下一行加上default-character-set = utf8
,保存看一下结果。当然先重启MySQL。
此时我的my.ini
是这个样子的。
此时我的MySQL是这个样子的。
跟之前没有什么变化嘛~ (⊙o⊙)… 没事,还有一步。 - 我们在
my.ini
的仅有的一个字段[mysqld]
里面再加上这一句character-set-server=utf8
,保存看一下结果。当然,先重启MySQL。
此时我的my.ini
是这个样子的。
此时我的MySQL是这个样子的。
完成了,哦也\(\^o\^)/.
现在的都推荐使用
utf8mb4
来取代utf8
,相对的设置或者创建的时候是选择utf8md4_general_ci
而不是utf8_general_ci
连接时设置编码方式
设定与数据库的连接的编码格式,这是在Linux下和Windows下通用的。
mysql_query("SET NAMES 'UTF8'");
#如果是用mysqli就是这个
#mysqli_set_charset($recouce ,"utf8");
如果其他地方都没有什么问题了的话,还可以试一下在phpmyadmin里新建table时的将排序规则
或者是叫做整理
,选择utf8_general_ci
,或者是在新建数据库时使用 CREATE DATABASE dbname DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
,新建数据表时使用 CREATE TABLE test (
id INT NOT NULL ,
name VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
PRIMARY KEY ( id )
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
在连接数据库之后,可以加入这两行代码,使其正常读写数据库。
mysqli_query("set character set 'utf8'");//读库
mysqli_query("set names 'utf8'");//写库
本文固定链接:https://windard.com/project/2016/02/20/Fix-MySQL-Encode-Error
原创文章,转载请注明出处:修复一下MySQL的编码问题 By Windard