2013-02-06 118 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驅動程序)也是如此。 –