mysql是咱们项目中很是经常使用的数据型数据库。可是由于咱们须要在数据库保存中文字符,因此常常遇到数据库乱码状况。下面就来介绍一下如何完全解决数据库中文乱码状况。 1、中文乱码 1.1、中文乱码 create table user(name varchar(11)); # 建立user表 insert into table user("carl"); # 添加数据 select * from user; insert into user value("哈哈"); 1 没法插入中文字符: 1.2、查看表字符编码 mysql> show create table user \G; *************************** 1. row *************************** Table: user Create Table: CREATE TABLE `user` ( `name` varchar(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec) 咱们能够看到表的默认字符集是latin1. 因此咱们在建立表的时候就须要指定表的字符集: create table user(name varchar(11)) default charset=utf8; 1 这样在Linux里面能够访问而且能够插入与访问这个表了。 1.3、数据库与操做系统编码 虽然在服务器端能够显示中文正常,可是在客户端可能会显示乱码。由于咱们的服务器是UTF8。 并且数据库的编码也存在问题。 这里咱们能够看character_sert_database与character_set_server的字符集都是latin1.那么在mysql数据库中,server,database,table的字符集都默认是latin1.下面咱们就来看看如何解决mysql乱码状况。 2、mysql设置变量的范围 2.1、session范围 查看数据库编码: show variables like '%char%'; 修改字符编码: set character_set_server=utf8; set character_set_database=utf8; show variables like '%char%'; 咱们能够看到字符集已经修改为都是utf8了。可是这里有一个问题,那就是咱们从新打开一个命令窗口而后查看数据编码就会出现下面的画面: 2.2、global范围 mysql设置变量的范围默认是session范围。若是设置多个会话的字符集那么须要设置global范围:Set [global|session] variables … set global character_set_database=utf8; set global character_set_server=utf8; show variables like '%char%'; 当咱们跨会话查看mysql字符集都会看到都是utf8。若是你觉得万事大吉了的话,那么你就大错特错了。 2.3、设置数据全局范围 当咱们数据库重启的时候,大家发现设置global范围的值又变成latin1了。 service mysqld restart mysql -uroot -pyourpassword show variables like '%char%'; 不要怕,下面就教你终极大招: 修改mysql配置文件/etc/my.cnf。 [mysqld] character-set-server=utf8 [client] default-character-set=utf8 [mysql] default-character-set=utf8 请注意这几个参数配置的位置,否则可能会启动不起来mysql服务: OK。这下若是你重启mysql服务也会发现它的字符集是utf8. 并且咱们建立表的时候不须要指定字符编码,它默认就是utf8; drop database test; create database test; use test; create table user(name varchar(11)); show create table user \G; 3、总结 我看网上不少答案都是直接在session级别设置mysql的字符编码,这是治标不治本的方法。咱们仍是要从源头上解决这个问题。那就是修改mysql默认的配置文件,把它的字符集修改为可以使用中文字符的UTF8就OK了。
from:http://blog.csdn.net/u012410733/article/details/61619656mysql