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+”则必须随后紧接着四位数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值