MySQL數據庫中字符集的問題


今天在做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

  1. +--------------------------+---------------------------------+   
  2. | Variable_name | Value |   
  3. +--------------------------+---------------------------------+    
  4. | character_set_client | utf8 |   
  5. | character_set_connection | utf8 |   
  6. | character_set_database | utf8 |  
  7. | character_set_filesystem | binary |   
  8. | character_set_results | utf8 |   
  9. | character_set_server | utf8 |   
  10. | character_set_system | utf8 |   
  11. | character_sets_dir | D:"mysql-5.0.37"share"charsets" |   
  12. +--------------------------+---------------------------------+  

(2) 還有一種修改mysql默認字符集的方法,就是使用mysql的命令

  1. mysql> SET character_set_client = utf8 ;  
  2. mysql> SET character_set_connection = utf8 ;   
  3. mysql> SET character_set_database = utf8 ;   
  4. mysql> SET character_set_results = utf8 ;    
  5. mysql> SET character_set_server = utf8 ;   
  6.  
  7. mysql> SET collation_connection = utf8 ;  
  8. mysql> SET collation_database = utf8 ;   
  9. mysql> SET collation_server = utf8 ; 

一般就算設置了表的mysql默認字符集為utf8並且通過UTF-8編碼發送查詢,你會發現存入數據庫的仍然是亂碼。問題就出在這個connection連接層上。解決方法是在發送查詢前執行一下下面這句:

  1. SET NAMES 'utf8';  

它相當於下面的三句指令:

    1. SET character_set_client = utf8;  
    2. SET character_set_results = utf8;   
    3. SET character_set_connection = utf8; 

(3)最后,如果不想通過以上兩種方式的修改字符集,可以在創建數據庫的時候明確指定當前數據庫要采用的編碼方式:

         create database hibernate character set  utf8;

----------------------------------------------------------------------------------------------------------

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM