1. 程式人生 > >【MySQL】【資料庫編碼問題】ERROR 1366 (HY000): Incorrect string value: '\xC0\xEE\xC7\xBF' for column

【MySQL】【資料庫編碼問題】ERROR 1366 (HY000): Incorrect string value: '\xC0\xEE\xC7\xBF' for column

【MySQL】ERROR 1366 (HY000): Incorrect string value: '\xC0\xEE\xC7\xBF' for column 'SNAME' at row 1

    今天在向MySQL資料庫中插入資料失敗,提示為ERROR 1366 (HY000): Incorrect string value: '\xC0\xEE\xC7\xBF' for column 'SNAME' at row 1

Error: 1366 SQLSTATE: HY000 (ER_TRUNCATED_WRONG_VALUE_FOR_FIELD) Message: Incorrect %s value: '%s' for column '%s' at row %ld 

從當前的提示錯誤上看,懷疑可能應該是跟漢字字串的編碼方式有關係:(據說mysql的UTF8也解決不了中文的編碼問題,用gbk才能解決。)

1、檢視當前伺服器狀態

status或者\s

mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.6.19, for Win32 (x86)

Connection id:          1
Current database:       test
Current user:           [email protected]
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.6.19 MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    gbk
Conn.  characterset:    gbk
TCP port:               3306
Uptime:                 4 hours 48 min 12 sec

Threads: 1  Questions: 40  Slow queries: 0  Opens: 76  Flush tables: 1  Open tables: 66  Queries per second avg: 0.002
--------------

從查詢的結果上看,當前資料庫為:test;Server characterset和Db characterset都是latin1,不是gbk。我們來看看latin1是什麼編碼方式:

我們還可以看看當前系統的字符集都有哪些,使用命令show character set;

從查詢結果中找到latin1,它的描述是:cp1252 West European   看來它是西歐編碼規則,不是中文的編碼,因此我們這裡才會亂碼了。gbk,是簡體中文編碼。

mysql> show character set;
+----------+-----------------------------+---------------------+--------+
| Charset  | Description                 | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese    | big5_chinese_ci     |      2 |
| dec8     | DEC West European           | dec8_swedish_ci     |      1 |
| cp850    | DOS West European           | cp850_general_ci    |      1 |
| hp8      | HP West European            | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |      1 |
| latin1   | cp1252 West European        | latin1_swedish_ci   |      1 |


| latin2   | ISO 8859-2 Central European | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                | swe7_swedish_ci     |      1 |
| ascii    | US ASCII                    | ascii_general_ci    |      1 |
| ujis     | EUC-JP Japanese             | ujis_japanese_ci    |      3 |
| sjis     | Shift-JIS Japanese          | sjis_japanese_ci    |      2 |
| hebrew   | ISO 8859-8 Hebrew           | hebrew_general_ci   |      1 |
| tis620   | TIS620 Thai                 | tis620_thai_ci      |      1 |
| euckr    | EUC-KR Korean               | euckr_korean_ci     |      2 |
| koi8u    | KOI8-U Ukrainian            | koi8u_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese   | gb2312_chinese_ci   |      2 |
| greek    | ISO 8859-7 Greek            | greek_general_ci    |      1 |
| cp1250   | Windows Central European    | cp1250_general_ci   |      1 |
| gbk      | GBK Simplified Chinese      | gbk_chinese_ci      |      2 |
| latin5   | ISO 8859-9 Turkish          | latin5_turkish_ci   |      1 |
| armscii8 | ARMSCII-8 Armenian          | armscii8_general_ci |      1 |
| utf8     | UTF-8 Unicode               | utf8_general_ci     |      3 |
| ucs2     | UCS-2 Unicode               | ucs2_general_ci     |      2 |
| cp866    | DOS Russian                 | cp866_general_ci    |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak  | keybcs2_general_ci  |      1 |
| macce    | Mac Central European        | macce_general_ci    |      1 |
| macroman | Mac West European           | macroman_general_ci |      1 |
| cp852    | DOS Central European        | cp852_general_ci    |      1 |
| latin7   | ISO 8859-13 Baltic          | latin7_general_ci   |      1 |
| utf8mb4  | UTF-8 Unicode               | utf8mb4_general_ci  |      4 |
| cp1251   | Windows Cyrillic            | cp1251_general_ci   |      1 |
| utf16    | UTF-16 Unicode              | utf16_general_ci    |      4 |
| utf16le  | UTF-16LE Unicode            | utf16le_general_ci  |      4 |
| cp1256   | Windows Arabic              | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic              | cp1257_general_ci   |      1 |
| utf32    | UTF-32 Unicode              | utf32_general_ci    |      4 |
| binary   | Binary pseudo charset       | binary              |      1 |
| geostd8  | GEOSTD8 Georgian            | geostd8_general_ci  |      1 |
| cp932    | SJIS for Windows Japanese   | cp932_japanese_ci   |      2 |
| eucjpms  | UJIS for Windows Japanese   | eucjpms_japanese_ci |      3 |
+----------+-----------------------------+---------------------+--------+
40 rows in set (0.00 sec)

既然知道了是伺服器編碼方式的問題,那麼下面來對它進行處理。

2、修改資料庫的預設編碼方式

使用命令alter database test character set gbk;

mysql> alter database test character set gbk;
Query OK, 1 row affected (0.09 sec)

檢視修改是否成功,使用命令:\s或則status;可以看到Db characterset:gbk 設定成功了。

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.6.19, for Win32 (x86)

Connection id:          1
Current database:       test
Current user:           [email protected]
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.6.19 MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    latin1
Db     characterset:    gbk
Client characterset:    gbk
Conn.  characterset:    gbk
TCP port:               3306
Uptime:                 5 hours 9 min 13 sec

Threads: 1  Questions: 46  Slow queries: 0  Opens: 76  Flush tables: 1  Open tables: 66  Queries per second avg: 0.002
--------------

這下應該可以執行插入操作了吧?執行插入後,發現還是一樣的報錯!!!

mysql> insert into s values(1,'李強','男',23);
ERROR 1366 (HY000): Incorrect string value: '\xC0\xEE\xC7\xBF' for column 'SNAME' at row 1

報錯的原因是,在修改資料庫test編碼方式前,表s就已經建立了。因此,表s它的編碼還是資料庫之前預設的編碼方式latin1,這個可以通過下面的命令來得到確認:

mysql> show create table s;
+-------+-----------------------------------
| Table | Create Table
+-------+-----------------------------------
| s     | CREATE TABLE `s` (
  `Sno` varchar(20) DEFAULT NULL,
  `SNAME` varchar(20) DEFAULT NULL,
  `SEX` varchar(10) DEFAULT NULL,
  `AGE` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+-----------------------------------
1 row in set (0.00 sec)

因此,還需要修改表格的編碼方式。

3、修改表格的預設編碼方式

對整個表格的編碼方式修改之前,這裡先說一下,也可以對單獨的某個屬性列進行編碼方式修改

方法是:(例如,修改表s的SNAME列的編碼方式為gbk)alter table s modify SNAME varchar(20) character set gbk;

mysql> alter table s modify SNAME varchar(20) character set gbk;
Query OK, 0 rows affected (0.66 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table s;
+-------+---------------------------------------------------------
| Table | Create Table
+-------+---------------------------------------------------------
| s     | CREATE TABLE `s` (
  `Sno` varchar(20) DEFAULT NULL,
  `SNAME` varchar(20) CHARACTER SET gbk DEFAULT NULL,
  `SEX` varchar(10) DEFAULT NULL,
  `AGE` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+---------------------------------------------------------
1 row in set (0.06 sec)

針對表格修改預設編碼方式方法:alter table s character set gbk;從下面的表格的查詢結果看,其他的非gbk編碼方式的屬性列(除了AGE 是定義為int型別,這個預設可以進行轉換的之外),其他的:Sno和SEX兩個列都是latin1編碼方式。因此,需要手動對這些列進行編碼方式的修改。(方法請參見本節開頭的討論。)

mysql> alter table s character set gbk;
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table s;
+-------+-----------------------------------------------
| Table | Create Table
+-------+-----------------------------------------------
| s     | CREATE TABLE `s` (
  `Sno` varchar(20) CHARACTER SET latin1 DEFAULT NULL,
  `SNAME` varchar(20) DEFAULT NULL,
  `SEX` varchar(10) CHARACTER SET latin1 DEFAULT NULL,
  `AGE` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+-------+-----------------------------------------------
1 row in set (0.00 sec)

我這裡需要執行的兩條列屬性級的編碼方式修改命令是:

alter table s modify sex varchar(10) character set gbk;

alter table s modify SNAME varchar(20) character set gbk;

而後執行插入操作即可成功:insert into s values(1,'李強','男',23);

mysql> insert into s values(1,'李強','男',23);
Query OK, 1 row affected (0.08 sec)

mysql> select * from s;
+------+-------+------+------+
| Sno  | SNAME | sex  | AGE  |
+------+-------+------+------+
| 1    | 李強  | 男   |   23 |
+------+-------+------+------+
1 row in set (0.00 sec)

4、修改表格屬性列的編碼方式

方法是:(例如,修改表s的SNAME列的編碼方式為gbk)alter table s modify SNAME varchar(20) character set gbk;

5、從源頭上避免這個問題發生-建立資料庫的時候就設定好編碼方式

如果是一個好的資料庫設計者,應該在資料庫一開始的時候就對資料庫中的表格屬性的使用進行詳細的規劃,比如哪些表格屬性會使用中文,

哪些屬性會有其他的業務規則等等。當然,這個不是本文要做的。下面介紹一下如何在資料庫建立階段就設定編碼方式:

create database test_code character set gbk;

執行完這條命令後,後面在該資料庫中建立的表格都預設是gbk編碼方式。

mysql> create database test_code character set gbk;
Query OK, 1 row affected (0.06 sec)

mysql> use test_code;
Database changed
mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.6.19, for Win32 (x86)

Connection id:          1
Current database:       test_code
Current user:           [email protected]
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.6.19 MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    latin1
Db     characterset:    gbk
Client characterset:    gbk
Conn.  characterset:    gbk
TCP port:               3306
Uptime:                 6 hours 1 min 34 sec

Threads: 1  Questions: 75  Slow queries: 0  Opens: 88  Flush tables: 1  Open tables: 68  Queries per second avg: 0.003
--------------

mysql> create table t_code(strA varchar(20) );
Query OK, 0 rows affected (0.20 sec)

mysql> show create table t_code;
+--------+-----------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                  |
+--------+-----------------------------------------------------------------------------------------------+
| t_code | CREATE TABLE `t_code` (
  `strA` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+--------+-----------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

另外,表格建立的時候,也可以指定編碼方式,方法如下:create table t_code2(strB varchar(20) character set utf8);

mysql> create table t_code2(strB varchar(20) character set utf8);
Query OK, 0 rows affected (0.19 sec)

mysql> show create table t_code2;
+---------+-------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                      |
+---------+-------------------------------------------------------------------------------------------------------------------+
| t_code2 | CREATE TABLE `t_code2` (
  `strB` varchar(20) CHARACTER SET utf8 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+---------+-------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

另外,這裡也可以從配置檔案的配置上做修改,MySql的配置檔案Windows下一般在系統目錄下或者在MySql的安裝目錄下名字叫my.ini

可以搜尋,Linux下一般是 /etc/my.cnf  這裡就先不介紹了。

從本問題可以看到,一開始對資料庫規劃好了,是可以省去很多麻煩的事的。

參考資料

1. http://zhidao.baidu.com/link?url=Jg-IUuge0d5hT-r2oApoohHVw1U_hfMZAFqIJak_S9-UVRr_ijDRhvIzFhyuQtjB_ogmVa0y6w_8r82z8f-DoK

2. http://blog.csdn.net/red4711/article/details/6007248

相關推薦

MySQL資料庫編碼問題ERROR 1366 (HY000): Incorrect string value: '\xC0\xEE\xC7\xBF' for column

【MySQL】ERROR 1366 (HY000): Incorrect string value: '\xC0\xEE\xC7\xBF' for column 'SNAME' at row 1     今天在向MySQL資料庫中插入資料失敗,提示為ERROR 1366

資料庫插入中文異常——ERROR 1366 (HY000): Incorrect string value: '\xD6\xD0\xCE\xC4' for column XXX at row 1

在用以下方法之前,請先執行下面命令檢視。 show variables like 'character%'; ——檢視所有編碼方式 show create table table_name; ——檢視某個表格的編碼方式 status ——檢視 檢

mysql匯入資料表中出現ERROR 1366 (HY000): Incorrect string value

【一】問題:  給mysql資料庫匯入資料的過程中,總是出現:ERROR 1366 (HY000): Incorrect string value 如下示: 【二】解決方法: set names gbk //設定客戶端的編碼格式,也就是你敲入的是什麼編碼的,客戶端會自

MySQLERROR 1366 (HY000): Incorrect string value: '\xE9\x83\x9D\xE7\x8E\x89...'

問題描述 新建的表無法插入中文字串: MySQL 插入資料時報錯:ERROR 1366 (HY000): Incorrect string value: ‘\xE9\x83\x9D\xE7\x8E\x89…’ for column ‘Author’ at row 1 原因 資料表

Linux MySQl 5.7.17 MySQL ERROR 1366(HY000):Incorrect string value 解決方法

MySQL ERROR 1366(HY000):Incorrect string value,在往資料庫中插入中文的時候會出現。這也就是編碼問題,網上大部分都是說設定下配置檔案中的設定,而可悲的是在我的環境中配置檔案是不允許修改,或者說和其他版本的不同。大家都知道中文常用的編碼方式是gbk或者utf-8。我建

資料庫插入中文異常——ERROR 1366 (HY000): Incorrect string value: '\xD6\xD0\xCE\xC4' for column XXX at row 1

本文轉載自https://blog.csdn.net/bluesliusmile/article/details/78584277?locationNum=10&fps=1 在用以下方法之前,請先執行下面命令檢視。 show variables like 'character

MYSQL不能顯示中文字,顯示錯誤“ERROR 1366 (HY000): Incorrect string value: '\xE5\xBC\xA0\xE4\xB8\x89'”

或者建表時帶上編碼utf8 CREATE TABLE `students`( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(20) NOT NULL, `nickname` VARCHAR(20) NULL,

ERROR 1366 (HY000): Incorrect string value: '\xA6' for column 'jy_message' at row 1

這個問題是字符集導致的   檢視資料庫字符集 mysql> show variables like 'character%'; +--------------------------+-----------------------------------------+ |

ERROR 1366 (HY000):Incorrect string value解決方案

我的電腦win7 64位,這個問題可能是所有win系統出現的問題 我出現的問題: 是正確的 出現了中文的張三,則錯誤,編碼錯誤 我嘗試的策略: 1設定客戶端地連線編碼格式. (命令: set names 'gbk') 2修改資料庫配置檔案編碼:   &

ERROR 1366 (HY000): Incorrect string value-解決方案

遇到的問題 在cmd中插入資料的時候報錯 mysql> insert into category(cid,cname) values('c005','家電'); ERROR 1366 (HY000): Incorrect string value: '

ERROR 1366 (HY000): Incorrect string value: 'xE8xB5xB5xE9x9BxB7' for column 'Sname' at row 1

客戶端 val sage mysq 就是 我們 student time 解決方案 問題描述: 我的操作步驟: 1、創建數據庫test,語句: create database test; 2、創建Student表: create table Student(SId varc

MySql 中文寫入資料庫亂碼及Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1解決

一、中文寫入亂碼問題 我輸入的中文編碼是urf8的,建的庫是urf8的,但是插入MySQL總是亂碼,一堆"???????????????????????"。可以使用以下的方式試試決解: 原url地址是 jdbc:mysql://localhost:3306/資料庫名 改為 jdbc:mysql://l

解決Incorrect string value: ‘\xF0\x9F\x8C\xB8’ for column ‘nickName’ at row 1,mysql儲存微信暱稱nickName的表情出錯

原因: 由於mysql預設編碼為utf-8,最大隻佔3個位元組,一些表情或者非常見字元,比如該例子中“xF0\x9F\x8C\xB8”佔4個位元組,這樣往資料表裡插入4個位元組的資料就會出錯。 解決辦法: 將相應資料庫和資料表的編碼由utf8修改為utf8mb4。具體兩者區別可以執行百度。

如何解決MySQL中輸入中文報錯的情況1366 (HY000): Incorrect string value

如何在MySQL中輸入中文 經過我的不斷摸索,在MySQL建表後,往表中的varchar(255)中輸入中文時報錯,大概是因為資料庫的預設編碼模式是latin1而不是utf8。所以其它部落格就會叫你去修改my.ini配置檔案裡的資訊,或者說在MySQL介面裡設定,如下: MySQL查

解決mysql插入資料時出現Incorrect string value: '\xF0\x9F...' for column 'name' at row 1的異常

這個問題,原因是UTF-8編碼有可能是兩個、三個、四個位元組。Emoji表情或者某些特殊字元是4個位元組,而MySQL的utf8編碼最多3個位元組,所以資料插不進去。 我的解決方案是這樣的 1.在mysql的安裝目錄下找到my.ini,作如下修改:   [mysqld] character

關於微信名稱特殊字元存資料庫出問題; Incorrect string value: ‘\xF0\x9F\x90\xAF’ for column ‘nickName’ at row 1

首先說一下為啥會出現這個問題: 我們的資料庫編碼通常為UTF8,MYSQL的UTF8編碼最多3個位元組,EMOJI表情或者某些特殊字元的編碼是4個位元組,導致存入資料庫時發生了異常。 解決辦法: 1. 修改該欄位的編碼格式:ALTER TABLE t_game_player C

mysql的utf8mb4編碼以及java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' 問題的處理

最近在做一次資料轉移(postgresql轉移到mysql)的時候,發現會出現如下錯誤: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name

emoji表情,直接存入資料庫,出現java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8E\xF0\x9F...' for.

最近專案中在做基於netty-socketio的web實時聊天功能,剛做好可以建群、發訊息,李老闆說要試一下功能,老闆第一條訊息就發了一個表情,當場導致後臺出現一大片紅,,,[笑哭] 問題:使用者傳送的emoji表情,直接存入資料庫,會出現java.sql.SQLException:

django 連線MYSQL時,資料遷移時報:django.db.utils.InternalError: (1366, "Incorrect string value: '\\xE9\\x97\\xAE\\xE9\\xA2\\x98' for column 'na

django 連線MYSQL時,資料遷移時報:django.db.utils.InternalError: (1366, "Incorrect string value: '\\xE9\\x97\\xAE\\xE9\\xA2\\x98' for column 'name' at row 5") 這個問題是由

MySQL必知必會第6章 過濾數據

sea 錯誤 arch order by ice where 大量數據 子句 否則 1、使用WHERE子句   數據庫一般包含大量數據,所以一般不會檢索所有行。只檢索所需數據需要指定搜索條件(search criteria),搜索條件也稱為過濾條件(filter condi