2013-02-06 66 views
1

我有一个数据库与MEDIUMBLOB字段在表中与ENGINE=InnoDB DEFAULT CHARSET=utf8在每个表上。MySQL,Java和UTF8

我通过URL连接到useUnicode=true&characterEncoding=UTF8&character_set_client=UTF8&character_set_database=UTF8&character_set_results=UTF8&character_set_server=UTF8&character_set_system=UTF8的数据库。

(我曾尝试只用useUnicode=true&characterEncoding=UTF8相同的结果。)

当我使用的命令行mysql数据库看价值,我可以看到非ASCII字符就好了。

但是,当我从数据库中使用executeQuery()getString()从字符串中读取时,我得到了乱码。我如何正确读取值?

我正在使用log4j来显示我正在写入数据库的字符串,而那些我读回的,以及我写的显示正常。

+1

那你怎么*显示*这些字符串?如果它是通过一个Web应用程序或类似的东西,那可能是你从数据库中获得了正确的数据,但是当它需要被编码发送到浏览器时出现了问题。 –

+1

(我假设“乱码”是指你期望非ASCII字符的所有奇怪字符,又名[mojibake](http://en.wikipedia.org/wiki/Mojibake)重新看到只是问号,这是一个不同的问题。) –

+0

如果它被解决,我会很高兴,你使用控制台显示?该设备显示你的字符? –

回答

5

这是一个BLOB,而不是一个字符串。所以你需要getBytes并手动解码。

new String(bytes, "UTF-8"); //Subsitute "UTF-8" with whatever encoding the blob is in 

如果您想要更透明的支持,请使用UTF-8定义mediumtext列。然后,所有这些配置都会生效,并且使用getString自动获得正确的字符串。

+2

是的,即将添加类似的评论 - 我没有注意到字段类型开始。 (我希望当你尝试使用错误的类型请求一个值时,司机会真的*失败*,而不是给你一个很可能错误的转换。) –

+0

@JonSkeet:我也希望这样,但那*确实*不是MySQL如何做事情。他们总是*尝试给你一些东西*。即使有可能是某种错误。 –

+0

@JoachimSauer:的确如此。我的经验是,许多其他数据库(或者至少它们的.NET和Java驱动程序)也是如此。 –