症状:在数据库中输入查询语句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
我使用它测试了几个小程序,中文都显示正常,而且都没死机、异常。
分享到:
相关推荐
那问题来了,怎么才能匹配出中文字符呢? 本文提供两种方法。 二 演示 2.1 环境 mysql> SHOW VARIABLES LIKE "%version%"; + ————————-+——————————+ | Variable_name | ...
以上内容仅是MySQL 5.1中文手册的部分概览,详细内容可在提供的"www.java1234.com]mysql5.1中文手册.chm"文件中查阅,涵盖了更深入的函数使用、性能调优、复制技术等多个方面。通过学习这本手册,用户可以全面掌握...
用户可以根据自己对数据的需求,使用不同的查询方式。通过不同的查询方式,可以获得不同的数据。MySQL中是使用SELECT语句来查询数据的。在这一章中将讲解的内容包括。 1、查询语句的基本语法 2、在单表上查询数据 3...
根据提供的文件信息,我们可以分析出该段代码是用于实现基于 JSP 和 MySQL 的按条件查询功能。接下来将详细解析此代码的关键部分,并提取其中的重要知识点。 ### 一、JSP与MySQL连接 #### 1. **引入必要的包** 在...
MySQL数据字典14章 本章介绍的主要特点、效益、用法的...同时,升级到MySQL 8,升级程序有所不同从以前的MySQL版本,要求您验证您的安装升级准备通过检查特定的先决条件。有关更多信息,参见2.10.1节,“升级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....
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 8 中文参考手册”是学习和工作的得力助手,无论是在日常开发、数据库设计,还是问题排查中,都能提供详尽的指导。通过深入阅读和实践,读者可以全面掌握MySQL 8的精髓,提升数据库管理技能。
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数据库中,进行数据查询时,我们经常需要使用到`OR`、`IN`和`UNION ALL`这些操作符。这些操作符在不同的场景下有不同的效率表现,但并不是像网络上普遍认为的那样,`UNION ALL`总是比`OR`和`IN`更快。实际上...
例如,在GBK编码下存储的中文数据在使用UTF-8编码进行查询时可能会出现问题。 #### 3. 搜索效率问题 中文模糊搜索涉及到大量的字符串比较操作,这会显著降低搜索效率,尤其是在大数据量的情况下。 ### 三、解决...
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 8.0 是当前广泛使用的开源关系型数据库管理系统,其参考手册教程为用户提供了一步一步的学习路径,...记得在遇到问题时,可以访问MySQL论坛,与其他用户交流,寻求解决方案,这将有助于深化你的MySQL知识和技能。
通过阅读《MySQL 8.0中文参考手册》提供的详细信息,无论是初学者还是经验丰富的开发者,都能进一步提升对MySQL的理解,更好地应对各种数据库管理和开发挑战。手册中的实例和解释将帮助读者在实践中应用这些理论知识...
总结,"mysql参考手册中文版"涵盖了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....
在MySQL中文手册中,你还可以找到关于优化查询性能、备份与恢复、复制与集群等高级主题的详细指南。例如,如何通过EXPLAIN命令分析查询执行计划,了解如何创建合适的索引以提升性能,或者如何使用mysqldump进行...
本"MySQL中文参考手则"旨在为用户全面解析MySQL的各个方面,帮助初学者和经验丰富的开发者更好地理解和运用这一强大的数据库系统。 一、MySQL基础 MySQL遵循SQL(结构化查询语言)标准,用于存储、管理和检索数据。...