mysql编码是乱码_MySQL编码详解及中文乱码问题解决方案

字符集是多个字符的集合,字符集种类较多,每一个字符集包含的字符个数不一样,常见的字符集名称:ASCII字符集、sql

GB2312字符集、BIG5字符集等。对于中文文字来讲,数目大,并且还分为简体中文和繁体中文两种不一样书写规范的文数据库

字,故通常出现乱码都出如今输入中文数据的时候。常见的中文字符集:GB23十二、GBK、UTF8等。浏览器

2.常见中文字符集介绍编码

GB2312:1980年发布,是中文信息处理的国际标准,在大陆及海外使用简体中文的地区是强制使用的惟一中spa

文编码。GB2312共收录6763个简体汉字、682个符号。命令行

GBK:汉字国际扩展码,基本上采用了原来GB2312全部的汉字及码位,并涵盖原Unicode中所有的汉字,总code

共收录了883个符号,21003个汉字及提供了1894个造字码位。GBK兼容GB2312,而且简、繁体字融于一库。server

UTF8:UTF8编码包含全世界全部国家须要用到的字符,可在各国各类支持UTF8字符集的浏览器上显示,即便用UTF8编码,可在同一页面中显示多种国家的文字。

3.字符序(Collation)

字符序是指在同一字符集内字符之间的比较规则,在肯定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系。每一个字符序惟一对应一种字符集,但一个字符集能够对应多种字符序,其中有一个是默认字符序(Default Collation). MySQL中的字符序名称听从命名惯例:以字符序对应的字符集名称开头:以_ci结尾的表示大小写不敏感、以_cs结尾的表示大小写敏感,以_bin结尾的表示按编码值比较。例如:在字符序“utf8_general_ci”下字符“a”和“A”是等价的。

4.MySQL的字符集支持

经过命令:show character set和show collation能够分别查看MySQL支持的字符集和排序方式。

42fbdaaa2999423181616df47dd35ce9.png

7cad169b9688cde4b0f0bc9006d520e8.png

5.关于MySQL字符集变量

使用命令show variables like ‘character%’;可看到当前链接的全部字符集设置。

0b5f96991202a499529fe8d217e90b2e.png

character_set_client:客户端来源数据使用的字符集

character_set_connection:链接层字符集

character_set_database:当前选中数据库的默认字符集

character_set_results:查询结果字符集

character_set_server:默认的内部操做字符集

character_set_system:系统元数据(字段名等)字符集

众所周知,MySQL对于字符集的指定能够细化到一个数据库,一张表,一列,应该使用什么字符集。可是传统的程序在建立数据库和表时并无使用十分负责的配置,它们用的是默认的配置,那么,默认的配置从何而来呢?

(1)编译MySQL时,指定了一个默认的字符集,这个字符集是 latin1;

(2)安装MySQL 时,能够在配置文件 (my.ini) 中指定一个默认的的字符集,若是没指定,这个值继承自编译时指定的;

(3)启动mysqld 时,能够在命令行参数中指定一个默认的的字符集,若是没指定,这个值继承自配置文件中的配置,此时 character_set_server 被设定为这个默认的字符集;

(4)当建立一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character_set_server;

(5)当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;

(6)在这个数据库里建立一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;

(7)当在表内设置一栏时,除非明确指定,不然此栏缺省的字符集就是表默认的字符集;

简单的总结一下,若是什么地方都不修改,那么全部的数据库的全部表的全部栏位的都用 latin1存储,不过咱们若是安装 MySQL,通常都会选择多语言支持,也就是说,安装程序会自动在配置文件中把default_character_set设置为 UTF-8,这保证了缺省状况下,全部的数据库的全部表的全部栏位的都用 UTF-8 存储。

上述6个变量中,除了character_set_client,character_set_connection,character_set_results三个变量以外,其他的变量都是在安装MySQL选择语言时,自动设置的,通常不用特地改变。因此大部分的问题都是出在character_set_client,character_set_connection,character_set_results的不匹配上。

这三个参数的做用以下:

742e8cb5b64cdc1f246f69fb2f07ad89.png

系统变量character_set_client:用来指定解析客户端传递数据的编码

系统变量character_set_connection:用来指定数据库内部处理时使用的编码

系统变量character_set_results:用来指定数据返回给客户端的编码方式

所以咱们只要保证上述三个变量的编码方式是同样的,那么编码问题就不会存在。

二. 如何修改默认字符集

1.最简单的修改方法,就是修改/etc/my.ini文件中的字符集默认配置。在[client]下添加上

default-character-set=utf8(这里用utf8举例说明,若是想改为gbk,则该位置设置为gbk便可)

上述方法等同于执行如下3个命令

SET character_set_client =utf8

SET character_set_results =utf8

SET character_set_connection= utf8

2.在建立jdbc链接的时候使用jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8&characterSetResults=UTF-8

characterEncoding=UTF-8指定了character_set_client、character_set_connection的值。

而characterSetResults=UTF-8则指定了character_set_results的值。与方法一的思路是同样的。

3.直接使用sql命令进行修改,在命令行中输入

SET character_set_client = utf8

SET character_set_results = utf8;

SET character_set_connection = utf8;

或者直接输入 set Names utf8 就能够同时修改三个。

4.若使用MySQL客户端 如Navicat之类的,则直接在new connection的时候在Encoding选项中选择utf8 便可

仍是推荐第一种方法,简单方便,全部的后续操做都不会编码问题。

三. 乱码问题分析

编码问题比较容易出如今共同开发的项目中,通常是因为小组中人员在在经过各类方式链接数据库时,所选择的编码

类型不一样。

Ques:数据从web端(web端使用utf8)写入,并在web页面中显示正常,但在数据库中查看倒是乱码?

Ans:这里总共有两个链接。 一个是经过jdbc链接的,另外一个是本身从mysql客户端建的链接用于直接查看数据库中的

数据。乱码的缘由在于创建这两个链接时,设置的编码方式不一样。假设,jdbc的链接是jdbc:mysql://localhost:3306/test

?characterEncoding=UTF-8&characterSetResults=UTF-8, 则意味着character_set_client,character_set_connection,

character_set_results 这三个参数都是utf8的。 即数据按照前两个参数的编码类型写入数据库,而且因为

character_set_results 也是utf8的,因此读取时返回的字符集也是utf8的则不会出现乱码。

此时若是本身mysql客户端创建的链接是gbk的, 即该链接的character_set_results是gbk的, 那么经过web端utf8格式

写入的中文字符在读取出来时须要转换为gbk的,那么就会出现乱码。因为utf8的码位远远超过gbk的,因此在gbk

的results看来该码位是不能显示的因此会显示???。 而此时若是你经过gbk的链接输入中文字符,则在web端页面

会显示Ñ¡Ôñ等外文字符,这是因为gbk的码位比utf8少, 对应的gbk的码位是能够在utf8中解析的,只是不能显示正确

的中文字符。

四.结论

咱们只要保证character_set_client,character_set_connection,character_set_results

是和你使用的客户端编码格式相同,即若是你的web页面是用utf8的,那么上述三个也必

须是utf8的。若是你项目中已经出现乱码了,那么应该在组内统一编码格式,再对数据库

中的数据进行从新插入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值