参考:http://blog.csdn.net/u012410733/article/details/61619656
数据库经常需要保存中文字符,有时不可避免地出现乱码问题,乱码出现几种情况如下:
1、浏览器上传数据编码(一般默认为ISO-8859-1)与Java 代码编码不同,一般常用两种方式解决:
AJAX 时指定编码类型:
$.ajax({
...,contentType:"application/json;charset=UTF-8",...
});
后端接口中将数据从ISO-8859-1转为UTF-8:
//假设data 为前端传来的字符串数据
String data = someString;
//以ISO-8859-1方式对数据进行解码
byte[] arry = data.getBytes("ISO-8859-1");
//转为与java文件相同的utf8编码
data = new String(arry,"utf-8");//省略第二个参数时,默认采用当前设置的编码(utf8)
//说明:编码的破折号都是可省略的,utf-8=utf8
2、使用JPA 或配置文件连接MySQL 时,应指定编码类型与数据库编码一致
url=jdbc:mysql://127.0.0.1:3306/qalims_tms?useUnicode=true&characterEncoding=UTF-8
username=root
password=123456
3、MySQL数据库编码设置不一致,主要讨论的问题,查看下一节
有时候在CMD能正常插入中文,但代码中插入却会出错,其代码中都可看到中文数据是正常显示的(说明不是代码与浏览
上传数据的问题),说明是数据库设置的问题。
1、数据库编码类型与设置编码的几种方式
设置编码的几种方式:设置数据表编码类型、设置数据库编码类型、设置数据库全局编码类型、设置服务器编码类型。
查看系统可用的编码类型:
SHOW VARIABLES LIKE '%char%';
展示结果:
可看到character_set_database 与 character_set_server 不同,且分别为utf8 与latin1,这是出现乱码的原因,也催促了我写这篇日志。
2、数据表编码查看与设置
创建时设置数据表编码:
CREATE TABLE testcharset(name varchar(20)) DEFAULT CHARSET=latin1;
查看数据表编码:
SHOW CREATE TABLE testcharset;
3、设置数据库与数据库服务编码类型
单纯的设置数据表的编码类型,不能保证中文正确显示,关键是要保证 character_set_database 与 character_set_server 相同,且支持中文,一般常用utf8。
设置数据库与数据库服务端的编码类型:
set character_set_database = 'utf8';
set global character_set_character = "utf8';
set character_set_server = 'utf8';
说明:全局数据库编码、数据库编码、数据表编码的优先级应该是由小变大的。
执行上面语句后,再次查看编码配置,可见database、server 的编码都变为utf8,但这只是表面的,重新启动mysql服务后,再次查看编码配置,各项编码又会变为原来的(如latin1)。
4、真正的修改服务器编码,重点
MySQL 安装目录下会有个默认的my-default.ini,根据该文件头部的描述,它是个模板文件,但需要注意的是,里面的配置项是不全的,感觉有点坑。
真正的配置应该是在my-default.ini 所在的目录新建my.ini,并根据需要配置相关项,之后重启MySQL 即可。
关键注意事项:
1、尽量不要修改my-default.ini,MySQL 的配置文件是分模块的,如[mysqld]、[client]模块等,里面的配置项必须是要该模块有的项,否则MySQL将无法启动。
如:将[mysql]模块的default-character-set= utf-8 配置在[mysqld]模块,启动MySQL将出错。
2、修改character_set_server 的值,需要将character-set-server=utf8 配置在[mysqld]模块!(注意模块名与键名!utf8写成utf-8也会出错!),之后重启,查看编码,发现character-ser-server已经变成设置的utf8.
mysql 究竟可进行哪些配置,有空单独写日志。
5、查看表状态、表中列列表、修改表编码
(1)、查看表状态
mysql> show table status from sqlstudy_db like '%countries%';
(2)、查看表列列表
mysql> show full columns from countries;
(3)、修改表编码
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;