`

Mysql对中文查询条件出现的问题

阅读更多
症状:在数据库中输入查询语句select * from table where name='中文',有一条结果集。但是用java来查询同样一条语句结果集却为空。查来查去也就只能归结到字符集的问题了。

首先,MySQL 数据库中的东西都是二进制存放的,支持任何数据,当然包括中文。你到命令行下 
insert into testtable values ( '中文' ); 
select * from testtable; 
全都显示正常。 
但是,虽然存取中文没问题,但排序、匹配的时候有问题。所以如果你的数据库里有中文的话,记得在配置文件中,如 c:winntmy.ini 中的 [mysqld] 里添加一行: 
default-character-set=gbk 
然后重启 mysql server 。 注意 gbk 要小写,不然 mysqld 启动不了。 


其次,数据库没问题,下面看看 Java 程序。在程序里很无聊地加一句调试语句: 
out.println("中文"); 
也显示正常,说明整个 java 环境没问题。 


所以,当然是联系 java 和 mysql 的部分,mysql jdbc driver 出问题了。 
分析一下,java 内部使用 unicode ,而 mysql 缺省使用 iso-8xxx(忘了),所以 jdbc driver 把查询字符串传给 mysql server 时,会做 unicode->iso-8xxx 的转换,从 mysql server 接受结果时,会做 iso-8xxx->unicode 的转换。(在屏幕上显示结果时会 unicode->GBK,不过不关这里的事。) 
这就有问题了,我在命令行下插入数据库的中文字符串是 GBK (这是简体中文 windows 的默认),所以 jdbc driver 接受查询结果时,应该做 GBK->unicode 的转换才对。 
验证一下,对从数据库中读出的中文字串 s , 
new String( s.getByte("iso-8xxx"), "gbk" ) 
将 s 先做一个 unicode->iso-8xxx 转换成它存放在数据库中的原始模样。我们知道它是 gbk ,所以手工来 gbk->unicode ,这样 java 程序就显式正常了。 
类似,写入数据库的时候,我们期待 jdbc driver 会把 unicode->gbk ,结果却是 unicode->iso-8xxx ,当然是乱码了。 


有很多文章,就到此为止,并告诉我们:要解决中文问题,自己手工转码吧。 
这实在是不负责任。如果每一个字符串都要手工转码,说明程序设计出了问题。 
想一想,写 mysql jdbc driver 的家伙会连转码都不知道? 
所以我看看 connector-j-3.0.7 里面的 readme, 找到一个解决方案: 
connection = DriverManager.getConnection( "jdbc:mysql://localhost/test?user=root&password=&useUnicode=true&characterEncoding=GBK" ); 
这是告诉 jdbc driver 强制按指定参数转码 


其实还是有问题。如果 mysql server 一定得用 iso-8xxx ,那就只有用上一个办法了。但我记得我的 mysql 是 gbk ,不是都改过 my.ini 了吗? jdbc driver 怎么都不自动探测 mysql server 的字符集呢? 
这个时候就看到开放源码的好处了 :-) connector-j-3.0.7 源码中确实有代码读取 mysql server 的信息,包括字符集。从注释中知道, 
作者为 unicode 转换到单字节字符集写了自己的转换函数,并号称比 jvm 的快百分之多少多少。所以代码中有一段,判段数据库如果使用的是单字节就调用自己的转换函数。但这段代码后面就忘了把多字节字符集交给 jvm 去转换了,所以变成了缺省的 iso-8xxx 转换。 
我的修改方式: commysqljdbcConnecter.java 这个文件的 1969 行, 
this.doUnicode = true; // force the issue 
将之上移四行到 1964 行,放在下面这一行的前面: 
try { 
用这份代码重新编出来的 jdbc driver ,你的 java 访问数据库的程序不用做任何修改就可以正确读写中文了,不过要记得 mysql server 要 default-character-set=gbk 
我使用它测试了几个小程序,中文都显示正常,而且都没死机、异常。

 

分享到:
评论

相关推荐

    如何在MySQL中判断中文字符?

    那问题来了,怎么才能匹配出中文字符呢?  本文提供两种方法。  二 演示  2.1 环境  mysql> SHOW VARIABLES LIKE "%version%";  +  ————————-+——————————+  | Variable_name | ...

    MySql基本查询、连接查询、子查询、正则表达查询讲解

    用户可以根据自己对数据的需求,使用不同的查询方式。通过不同的查询方式,可以获得不同的数据。MySQL中是使用SELECT语句来查询数据的。在这一章中将讲解的内容包括。 1、查询语句的基本语法 2、在单表上查询数据 3...

    MySQL8中文参考手册2022官方.zip

    MySQL数据字典14章 本章介绍的主要特点、效益、用法的...同时,升级到MySQL 8,升级程序有所不同从以前的MySQL版本,要求您验证您的安装升级准备通过检查特定的先决条件。有关更多信息,参见2.10.1节,“升级MySQL”..

    MySQL 5.1中文手冊

    2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL 2.7....

    MySQL 5.1参考手册中文版

    2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL ...

    mysql5.1中文手册

    MySQL对标准SQL的扩展 1.8.5. MySQL与标准SQL的差别 1.8.6. MySQL处理约束的方式 2. 安装MySQL 2.1. 一般安装问题 2.1.1. MySQL支持的操作系统 2.1.2. 选择要安装的MySQL分发版 2.1.3. 怎样...

    MySql 5.1 参考手册.chm

    2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL 2.7....

    MySQL 5.1参考手册 (中文版)

    2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL 2.7....

    MySQL 5.1官方简体中文参考手册

    2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL ...

    MYSQL中文手册

    2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL...

    mysql官方中文参考手册

    2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL 2.7....

    ThinkPHP6.0以上兼容mysql下JSON_CONTAINS使用

    Thinkphp6.0以上版本在查询MySql数据表中JSON类型数据下使用JSON_CONTAINS函数

    MySQL 5权威指南(第3版) 中文版 下载地址

     9.3 对查询结果进行排序(ORDER BY)  9.4 筛选数据记录(WHERE,HAVING)  9.5 涉及多个数据表的关联查询(LEFT/RIGHT JOIN)  9.6 合并查询结果(UNION)  9.7 分组查询,统计函数(GROUP BY)  9.8 ...

    MySQL5.1参考手册官方简体中文版

    2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL 2.7....

    MySQL 5.1参考手册

    2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL 2.7....

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    28-MySQL数据库多实例启动问题排错方法及实战排错.avi 29-MySQL数据库多实例实战排错02.avi 30-增加MySQL数据库第三个实例实战讲解.avi 31-MySQL数据库多实例的其他故障问题说明.avi 第三部:MySQL应用管理及进阶...

    MySQL5 权威指南第3版中文版_part1

     9.3 对查询结果进行排序(ORDER BY)  9.4 筛选数据记录(WHERE,HAVING)  9.5 涉及多个数据表的关联查询(LEFT/RIGHT JOIN)  9.6 合并查询结果(UNION)  9.7 分组查询,统计函数(GROUP BY)  9.8 修改...

    Mysql最全讲义.docx

    目录 内容 6 1、数据库概述及数据准备 6 1.1、SQL概述 6 1.2、什么是数据库 6 ...4.5、将查询出来的字段显示为中文 23 5、条件查询 23 5.1、等号操作符 24 5.2、 操作符 25 5.3、between … and …操作符 26

    数据库基础实验的实验报告附图

    2.对各表中的数据进行不同条件的连接查询和嵌套查询; 1) 查询每个学生及其选课情况; 2) 查询每门课的间接先修课 3) 将STUDENT,SC进行右连接 4) 查询有不及格的学生姓名和所在系 5) 查询所有成绩为优秀...

    Mysql全文搜索match against的用法

    1.使用Mysql全文检索fulltext的先决条件 表的类型必须是MyISAM建立全文检索的字段类型必须是char,varchar,text2.建立全文检索先期配置由于Mysql的默认配置是索引的词的长度是4,所以要支持中文单字的话,首先更改这个...

Global site tag (gtag.js) - Google Analytics