解決hibernate插入中文數據亂碼、報錯的問題
在hibernate案例測試的時候,會發現這樣一個問題,hibernate自動創建的表默認字符集爲latin1,這樣的結果就是插入中文的時候,數據庫中記錄出現亂碼(表現爲疑問號'?')。
按照網上的解決辦法在hibernate項目的核心配置文件中的 連接url中配置如下語句:
<property name="hibernate.connection.url">
jdbc:mysql:///test?useUnicode=true&characterEncoding=utf-8
</property>
即在自己創建的數據庫test後面添加?useUnicode=true&characterEncoding=utf-8
結果是在測試中插入中文的時候,亂碼消失了,卻提示如下錯誤:
org.hibernate.exception.GenericJDBCException: could not execute statement
那麼可以確定,不是缺少這條語句的原因了。
下一個思路就是更改MySQL的配置文件my.ini。修改默認字符集。
在[mysqld]下添加語句
character_set_server=utf8
init_connect='SET NAMES utf8
在[client]下添加如下語句:
default-character-set=utf8
之後啓動MySQL,運行項目,依然是原來的問題。那麼可以排除MySQL默認字符集的原因。
然後手動更改數據表中對應字段的編碼爲utf8,發現可以插入中文了。難道說,每次hibernate創建表之後都得手動更改字段的字符編碼?顯然太麻煩,不能完全解決問題。
當網上的辦法不能解決問題,自己的思路有陷入困境的時候,莫名查看了一下數據庫的屬性,發現數據庫的字符編碼是latin。
將數據庫的字符集更改爲utf8(注意:此處是數據庫的字符編碼,而不是表中對應字段的編碼)之後,hibernate自動生成的表中的字符串字段的字符集已經是utf8了。
至此問題解決。
需要注意的是:如果原來由hibernate自動創建的表中的字段已經是latin1字符集了,那麼你還是需要手動更改對應字段的字符集,因爲默認數據庫的字符集與數據表字段的字符集可以不相同,不會因爲你更改了數據庫的編碼系統就會自動更改數據表中的字段編碼。
如果你在更改數據庫的編碼爲utf8之後,需要測試hibernate自動生成的表中字段的編碼是否爲utf8,最簡單的方法就是刪除原來的數據表,然後重新運行程序,觀察生成表中的字段編碼是否爲utf8
總結一點:
因爲hibernate可以管數據表的自動生成,但是一般管不了數據庫的創建。
若要使用中文,那麼在數據庫創建的時候就設置好數據庫屬性中的字符編碼爲utf8