mysql 1366 hy000_ERROR 1366 (HY000): Incorrect string value错误解决办法
本文地址:http://www.dutycode.com/post-5.html
除非注明,文章均為 www.dutycode.com 原創,歡迎轉載!轉載請注明本文地址,謝謝。
錯誤詳情如上圖:
原因主要是:字符集的問題
解決辦法,將數據庫、數據表以及數據表中的字段全部統一設置成utf8即可。
參考文章:
1、http://www.oseye.net/question/74
2、http://www.cnblogs.com/shishm/articles/1614407.html
3、http://tree-161219.iteye.com/blog/745054
在一個用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頁面文件的編碼:
pageEncoding="utf-8"%>
2、Struts、Spring配置文件(XML)的編碼:
version="1.0" encoding="utf-8"?>
3、Hibernate映射文件的編碼:
version="1.0" encoding="utf-8"?>
4、數據源配置中jdbcurl(數據庫連接)指定的編碼:
如果在spring配置文件applicationContext.xml里配置,在數據源的節點中添加jdbcUrl屬性如下:
jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=utf-8
或者,如果在hibernate配置文件中,可以添加如下兩個屬性的配置代碼:
name="connection.useUnicode">true
utf-8
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&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
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的mysql 1366 hy000_ERROR 1366 (HY000): Incorrect string value错误解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库技术mysql能干什么_MySQL
- 下一篇: java闭锁_java8中CountDo