今天在做Hibernate案例,往mysql中寫記錄的時候,出現ERROR: Incorrect string value: '\xE5\x8A\xA0\xE5\x86\x85...' for column 'content' at row 1
后來發現在程序中寫的字符串編碼采用的是utf-8,但是由於我是通過非安裝方式裝的mysql,沒有設置數據庫默認的碼表,所以數據庫默認的碼表不是utf-8,而是latin1:

找到原因后通過修改數據庫碼表的方式問題解決,成功向數據庫存入記錄。下面通過查看網上相關細聊,總結下修改MySQL字符集的問題:
首先,MySQL的字符集問題主要是兩個概念,一個是Character Sets,一個是Collations,前者是字符內容
及編碼,后者是對前者進行比較操作的一些規則。這兩個參數集可以在數據庫實例、單個數據庫、表、列等四個級
別指定。
對於使用者來說,一般推薦使用utf8編碼來存儲數據。而要解決亂碼問題,不單單是MySQL數據的存儲問題,還
和用戶的程序文件的編碼方式、用戶程序和MySQL數據庫的連接方式都有關系。
首先,MySQL有默認的字符集,這個是安裝的時候確定的,在編譯MySQL的時候可以通過DEFAULT_CHARSET=
utf8和DEFAULT_COLLATION=utf8_general_ci這兩個參數(MySQL5.5版本,5.1版本用--with-charset=
utf8 --with-collation=utf8_general_ci)來指定默認的字符集為utf8,這也是最一勞永逸的辦法,這樣指定后,
客戶端連接到數據庫的編碼方式也默認是utf8了,應用程序不需要任何處理。
(1) 最簡單的修改方法,就是修改mysql的my.ini文件中的字符集鍵值,
如 default-character-set = utf8
character_set_server = utf8
修改完后,重啟mysql的服務,service mysql restart
使用 mysql> SHOW VARIABLES LIKE 'character%';查看,發現數據庫編碼均已改成utf8
- +--------------------------+---------------------------------+
- | Variable_name | Value |
- +--------------------------+---------------------------------+
- | character_set_client | utf8 |
- | character_set_connection | utf8 |
- | character_set_database | utf8 |
- | character_set_filesystem | binary |
- | character_set_results | utf8 |
- | character_set_server | utf8 |
- | character_set_system | utf8 |
- | character_sets_dir | D:"mysql-5.0.37"share"charsets" |
- +--------------------------+---------------------------------+
(2) 還有一種修改mysql默認字符集的方法,就是使用mysql的命令
- mysql> SET character_set_client = utf8 ;
- mysql> SET character_set_connection = utf8 ;
- mysql> SET character_set_database = utf8 ;
- mysql> SET character_set_results = utf8 ;
- mysql> SET character_set_server = utf8 ;
- mysql> SET collation_connection = utf8 ;
- mysql> SET collation_database = utf8 ;
- mysql> SET collation_server = utf8 ;
一般就算設置了表的mysql默認字符集為utf8並且通過UTF-8編碼發送查詢,你會發現存入數據庫的仍然是亂碼。問題就出在這個connection連接層上。解決方法是在發送查詢前執行一下下面這句:
- SET NAMES 'utf8';
它相當於下面的三句指令:
- SET character_set_client = utf8;
- SET character_set_results = utf8;
- SET character_set_connection = utf8;
(3)最后,如果不想通過以上兩種方式的修改字符集,可以在創建數據庫的時候明確指定當前數據庫要采用的編碼方式:
create database hibernate character set utf8;

----------------------------------------------------------------------------------------------------------
注:本文部分參考http://database.51cto.com/art/201010/229167.htm
