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

概述:

01.版本 MYSQL 5.6
mysql> select  version();
+-----------+
| version() |
+-----------+
| 5.6.29    |
+-----------+

02.操作系統版本

[root@mynode1 ~]# cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 7.2 (Maipo)

問題:
 
在使用mysql的source執行dum.sql轉儲文件時報錯,由於sql轉儲文件裏有中文,所以亂碼的問題會經常發生,dmp.sql文件無論是用客戶端工具nivicat,還是用mysql、source命令執行均無法正常執行

報錯如下:

ERROR 1366 (HY000): Incorrect string value: '\xBD\xF1\xB3\xAF' for column 'username' at row 1

    但在secureCRT單獨執行insert插入中文可以執行成功,insert命令成功執行如下:

mysql> INSERT INTO members VALUES ('1','飛翔的豬','root','9bde72','0','0','1','1','1','1','0','','1267364160','346','0','9999','0');

Query OK, 1 row affected (0.00 sec)
 
經過分析,以上錯誤是與跟數據庫相關的字符編碼導致的,以下是我的解決思路

1.檢查my.conf端字符編碼
2.檢查數據庫字符編碼
3.檢查建表的字符編碼
4.檢查表columns的字符編碼
5.檢查SQL轉儲文件的字符編碼

1.首先檢查my.conf的字符編碼

#more /etc/my.conf

[client]
default-character-set=utf8
[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci

經確認,my.conf的編碼爲UTF8,collation-server=utf8_general_ci沒有問題

2.檢查mysql數據庫的字符編碼

mysql> show variables like '%char%';
+--------------------------+---------------------------------------------------------------+
| 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     | latin1                                                        |
| character_set_system     | utf8                                                          |
| character_sets_dir       | /usr/local/mysql/share/charsets/ |
+--------------------------+---------------------------------------------------------------+

mysql> show create database test;
+----------+----------------------------------------------------------------+
| Database | Create Database                                                |
+----------+----------------------------------------------------------------+
| lanke    | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------------+

數據庫的字符集均是UTF8

3.檢查建表的SQL語句編碼

Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| members | CREATE TABLE `members` (
.............
.....................省略
) ENGINE=MyISAM AUTO_INCREMENT=30107 DEFAULT CHARSET=utf8 

4.檢查表列的編碼格式

mysql> SHOW FULL COLUMNS FROM members;
+--------------------+-----------------------+-----------------+------+-----+---------+----------------+
| Field              | Type                  | Collation       | Null | Key | Default | Extra          |
+--------------------+-----------------------+-----------------+------+-----+---------+----------------+
| uid                | mediumint(8) unsigned | NULL            | NO   | PRI | NULL    | auto_increment |
| email              | char(40)              | utf8_general_ci | NO   | MUL |         |                |
| username           | char(15)              | utf8_general_ci | NO   | UNI |         |                |
| password           | char(32)              | utf8_general_ci | NO   |     |         |                |
| status             | tinyint(1)            | NULL            | NO   |     | 0       |                |
| emailstatus        | tinyint(1)            | NULL            | NO   |     | 0       |                |
| avatarstatus       | tinyint(1)            | NULL            | NO   |     | 0       |                |
| videophotostatus   | tinyint(1)            | NULL            | NO   |     | 0       |                |
| adminid            | tinyint(1)            | NULL            | NO   |     | 0       |                |
| groupid            | smallint(6) unsigned  | NULL            | NO   | MUL | 0       |                |
| groupexpiry        | int(10) unsigned      | NULL            | NO   |     | 0       |                |
| extgroupids        | char(20)              | utf8_general_ci | NO   |     |         |                |
|+--------------------+-----------------------+-----------------+------+-----+---------+----------------

經檢查members表和列的字符編碼爲UTF8

以上字符集均是統一的UTF8格式,那麼問題很可能出現在SQL的轉儲文件中,我們需要一個統一的unicode格式或許能解決中文亂碼問題,用ultraedit打開dmp.sql轉儲文件進行字符及轉化

具體如下

打開ultraeidt工具欄,分別找到 文件-->轉換-->ASCII到UTF8(UNICODE編輯),完成後進行保存,再上傳到mysql服務器上,重新執行source命令

mysql>source /tmp/dum.sql

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)
.....
...........
................省略
Query OK, 1 row affected (0.00 sec)

至此,不再出現ERROR 1366 (HY000)報錯,中文字段全部成功insert,在客戶端查看錶,中文正常顯示不再有亂碼問題

注:
什麼是unicode?

     Unicode 是爲了解決傳統的字符編碼方案的侷限而產生的,例如ISO 8859所定義的字符雖然在不同的國家中廣泛地使用,可是在不同國家間卻經常出現不兼容的情況。很多傳統的編碼方式都有一個共同的問題,即容許電腦處理雙語環境(通常使用拉丁字母以及其本地語言),但卻無法同時支持多語言環境(指可同時處理多種語言混合的情況)。
    Unicode 編碼包含了不同寫法的字,如“ɑ/a”、“戶/戶/戸”。然而在漢字方面引起了一字多形的認定爭議(詳見中日韓統一表意文字主題)。
    在文字處理方面,統一碼爲每一個字符而非字形定義唯一的代碼(即一個整數)。換句話說,統一碼以一種抽象的方式(即數字)來處理字符,並將視覺上的演繹工作(例如字體大小、外觀形狀、字體形態、文體等)留給其他軟件來處理,例如網頁瀏覽器或是文字處理器。
幾乎所有電腦系統都支持基本拉丁字母,並各自支持不同的其他編碼方式。Unicode爲了和它們相互兼容,其首256字符保留給ISO 8859-1所定義的字符,使既有的西歐語系文字的轉換不需特別考量;並且把大量相同的字符重複編到不同的字符碼中去,使得舊有紛雜的編碼方式得以和Unicode編碼間互相直接轉換,而不會丟失任何信息。舉例來說,全角格式區段包含了主要的拉丁字母的全角格式,在中文、日文、以及韓文字形當中,這些字符以全角的方式來呈現,而不以常見的半角形式顯示,這對豎排文字和等寬排列文字有重要作用。
在表示一個Unicode的字符時,通常會用“U+”然後緊接着一組十六進制的數字來表示這一個字符。在基本多文種平面(英文爲 Basic Multilingual Plane,簡寫 BMP。它又簡稱爲“零號平面”, plane 0)裏的所有字符,要用四位十六進制數(例如U+4AE0,共支持六萬多個字符);在零號平面以外的字符則需要使用五位或六位十六進制數了。舊版的Unicode標準使用相近的標記方法,但卻有些微的差異:在Unicode 3.0裏使用“U-”然後緊接着八位數,而“U+”則必須隨後緊接着四位數。
發佈了145 篇原創文章 · 獲贊 111 · 訪問量 102萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章