MySQL相關的中文編碼錯誤解決【轉】


在一個用Struts + Spring+ Hibernate + Mysql架構的的項目里,通過前台表單向后台MySql數據庫添加

數據,當遇到提交中文信息的時候,問題總是比較多,我見過的出錯的情況有兩種:

     1)錯誤情況1:

       ERROR 1366 (HY000): Incorrect string value

        Incorrect string value: '\xA1\xAA\xA1\xAA\xB0\xFC...' for column 'content' at row 1 
Hibernate flushing: Could not execute JDBC batch update; uncategorized SQLException for SQL [insert into blog (comments, content, createdate, description, tid, title, uid, id) values (?, ?, ?, ?, ?, ?, ?, ?)]; SQL state [HY000]; error code [1366]; Incorrect string value: '\xA1\xAA\xA1\xAA\xB0\xFC...' for column 'content' at row 1; nested exception is java.sql.BatchUpdateException: Incorrect string value: '\xA1\xAA\xA1\xAA\xB0\xFC...' for column 'content' at row 1

     2)錯誤情況2:

      提交時不報錯,但是數據庫中插入的中文顯示為如“???”的亂碼,同時在控制台打印的也是“???”的亂碼字符。

      因此涉及到中文字符的問題時,要格外注意“字符集編碼”的問題。

====================

      總結一下,在這樣一個項目里,涉及到設置字符集的地方有:

1、JSP頁面文件的編碼:

       <%@ page pageEncoding="utf-8"%>

2、Struts、Spring配置文件(XML)的編碼:

       <?xml version="1.0" encoding="utf-8"?>

3、Hibernate映射文件的編碼:

        <?xml version="1.0" encoding="utf-8"?>

4、數據源配置中jdbcurl(數據庫連接)指定的編碼:

       如果在spring配置文件applicationContext.xml里配置,在數據源的節點中添加jdbcUrl屬性如下:

      jdbc:mysql://localhost:3306/dbname?useUnicode=true&amp;characterEncoding=utf-8

      或者,如果在hibernate配置文件中,可以添加如下兩個屬性的配置代碼:

      <property name="connection.useUnicode">true</property>
   <property name="connection.characterEncoding">utf-8</property>

5、Mysql默認字符集:

       在Mysql的安裝根目錄下,my.ini中:

# The default character set that will be used when a new schema or table is
# created and no character set is defined

default-character-set=utf-8

         安裝時,默認的字符集是latin1.

        Mysql默認字符集,可以在安裝時配置,也可以通過Mysql自帶的MySQL Server Instance Config Wizard重新配置,配置后重啟服務才可生效。

6、數據庫表字段的字符集:

      MySQL對於字符集的指定可以細化到一個數據庫,一張表,一列(字段),應該用什么字符集。

      通過在create語句中添加character set 參數指定相應的字符集,如果不指定,則會默認使用其上一個層

級的字符集。

==============問題分析=============

     那么,來分析一下,問題可能是出現在什么地方?

      結合以上總結的可能出錯的幾個地方,我逐一進行了測試,最后發現和預想的結果一致:

     通過報錯信息可以看出,這個問題應該是表單提交的中文字符與Mysql本身的字符集的設置有沖突導致

的,因此排除項目中那些與頁面文件相關的字符集設置。

     網上有些地方說,這個問題與下面這個配置中指定的字符集相關:

      jdbc:mysql://localhost:3306/dbname?useUnicode=true&amp;characterEncoding=utf-8

      但是,經過我的驗證,問題可能並不在此。

      經過反復的測試驗證,我確定問題就出在Mysql本身默認字符集的設置上。

     通過命令: mysql> SHOW VARIABLES LIKE 'character%';

查看Mysql默認字符集的相關設置:
+--------------------------+---------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir        | D:\Program Files\MySQL\MySQL Server 5.1\share\charsets\ |
+--------------------------+---------------------------------+

       由於表是根據hibernate映射文件在spring容器加載啟動時自動創建的,沒有為數據庫、表和表的字段

指定字符集,因此,創建時均使用Mysql默認的latin1字符集,而這個字符集顯然根本不可能處理中文字符,

上面的報錯信息就是因為它而產生的。

       因此,通過修改Mysql的默認字符集或者在創建數據庫、表和表的字段時指定字符集解能決這個問題。

     下面,以修改Mysql的默認字符集為例說明。

      為了讓Mysql支持中文字符,可以把它的默認字符集設置為:

      utf-8     ——支持幾乎所有字符

      gb2312 ——是簡體中文的碼

      gbk        ——支持簡體中文及繁體中文

       中的任何一個。

      修改默認字符集的方法如下:


(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:\Program Files\MySQL\MySQL Server 5.1\share\charsets\ |
+--------------------------+---------------------------------+

(2) 還有一種修改字符集的方法,就是使用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字符集相關知識更詳細的介紹請看:

1、Mysql字符集設置詳解

2、GBK、GB2312、UTF8區別,解決MYSQL中文亂碼問題


免責聲明!

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



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