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

一、中文乱码

数据库经常需要保存中文字符,有时不可避免地出现乱码问题,乱码出现几种情况如下:

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%';

展示结果:

803b570d4f059694aaac50bddbfae1bf.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值