概述:
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+”则必须随后紧接着四位数。
ERROR 1366 (HY000): Incorrect string value: '\ ' for column ' ' at row 1
最新推荐文章于 2024-09-13 23:39:30 发布