mysql数据库乱码解析

mysql中文乱码问题解析  首先分析乱码的情况 1.写入数据库时作为乱码写入 2.查询结果以乱码返回  究竟在发生乱码时是哪一种情况呢? 我们先在mysql命令行下输入 show variables like '%char%'; 查看mysql字符集设置情况

在查询结果中可以看到mysql数据库系统中客户端、数据库连接、数据库、文件系统、查询结果、服务器、系统的字符集设置 在这里,文件系统字符集是固定的,系统、服务器的字符集在安装时确定,与乱码问题无关 乱码的问题与客户端、数据库连接、数据库、查询结果的字符集设置有关 *注:客户端是看访问mysql数据库的方式,通过命令行访问,命令行窗口就是客户端,通过JDBC等连接访问,程序就是客户端  我们在向mysql写入中文数据时,在客户端、数据库连接、写入数据库时分别要进行编码转换 在执行查询时,在返回结果、数据库连接、客户端分别进行编码转换  现在我们应该清楚,乱码发生在数据库、客户端、查询结果以及数据库连接这其中一个或多个环节  接下来我们来解决这个问题 在登录数据库时,我们用mysql --default-character-set=字符集-u root -p进行连接,这时我们再用show variables like '%char%';命令查看字符集设置情况,可以发现客户端、数据库连接、查询结果的字符集已经设置成登录时选择的字符集了 如果是已经登录了,可以使用set names 字符集;命令来实现上述效果,等同于下面的命令:set character_set_client = 字符集 set character_set_connection = 字符集 set character_set_results = 字符集 如果是通过JDBC连接数据库,可以这样写URL:

URL=jdbc:mysql://localhost:3306/abs?useUnicode=true&characterEncoding=字符集 JSP页面等终端也要设置相应的字符集  数据库的字符集可以修改mysql的启动配置来指定字符集,也可以在create database时加上default character set 字符集来强制设置database的字符集 通过这样的设置,整个数据写入读出流程中都统一了字符集,就不会出现乱码了  为什么从命令行直接写入中文不设置也不会出现乱码? 可以明确的是从命令行下,客户端、数据库连接、查询结果的字符集设置没有变化 输入的中文经过一系列转码又转回初始的字符集,我们查看到的当然不是乱码 但这并不代表中文在数据库里被正确作为中文字符存储 举例来说,现在有一个utf8编码数据库,客户端连接使用GBK编码,connection使用默认的ISO8859-1(也就是mysql中的latin1),我们在客户端发送“中文”这个字符串,客户端将发送一串GBK格式的二进制码给connection层,connection层以ISO8859-1格式将这段二进制码发送给数据库,数据库将这段编码以utf8格式存储下来,我们将这个字段以utf8格式读取出来,肯定是得到乱码,也就是说中文数据在写入数据库时是以乱码形式存储的,在同一个客户端进行查询操作时,做了一套和写入时相反的操作,错误的utf8格式二进制码又被转换成正确的GBK码并正确显示出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值