MySQL 笔记 —— 中文乱码解决、修改mysql服务端编码

版权声明:转载请注明出处! https://blog.csdn.net/qq_19865749/article/details/79235422

参考: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数据库编码设置不一致,主要讨论的问题,查看下一节


二、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 究竟可进行哪些配置,有空单独写日志。





阅读更多
换一批

没有更多推荐了,返回首页