【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

从MySQL官网上查看错误码信息http://dev.mysql.com/doc/refman/5.6/en/error-messages-server.html看到

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:           ODBC@localhost
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:           ODBC@localhost
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:           ODBC@localhost
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相关推荐

  1. 数据库错误 ERROR 1366 (HY000): Incorrect string value: ‘\xD4\xF8\xBB\xAA‘ for column ‘Sname‘ at row 1解决

    数据库错误 ERROR 1366 (HY000): Incorrect string value: '\xD4\xF8\xBB\xAA' for column 'Sname' at row 1解决 一 ...

  2. ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'name' at row 1

    ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'name' at row 1 数据库字符集问题,查 ...

  3. mysql 插入中文 ERROR 1366 (HY000): Incorrect string value: '\xE7\x8E\x9E\x97' for column

    1.出现这个问题,是因为我们的字符编码设置出现了问题,用cmd打开命令终端,查看我们的数据库设置: 2.输入命令use crm(crm是我创建的数据库,大家在修改时换成自己的数据库名即可) 再输入:s ...

  4. mysql:ERROR 1366 (HY000): Incorrect string value: ‘\x80\xE6\x96\xB0‘ for column ‘name‘ at row 1

    1.打开命令提示符窗口(win+r),查看cmd窗口格式 2.输入chcp 65001修改cmd窗口编码格式为utf-8 3.成功解决 4.如果还是不行输入: alter table student ...

  5. windows下:ERROR 1366 (HY000): Incorrect string value: ‘\xC1\xF5\xB1\xB8‘ for column ‘name‘ at row 1

    在windows下插入中文时报此错误的解决办法! 在Windows下,命令行窗口不支持UTF-8編碼,所以使用"set names utf8;"不會達到轉化中文的效果.但是這個問題 ...

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

    MySQL ERROR 1366(HY000):Incorrect string value,在往数据库中插入中文的时候会出现. 这也就是编码问题,网上大部分都是说设置下配置文件中的设置,而可悲的是在 ...

  7. ERROR 1366 (HY000): Incorrect string value......(Mysql报错解决)

    2019.11.29更新:发现了新的解决方法 错误描述 在控制台执行插入操作的时候,Mysql报错ERROR 1366 (HY000): Incorrect string value--插入操作失败, ...

  8. linux mysql 1366_Linux MySQl 5.7.17 MySQL ERROR 1366(HY000):Incorrect string value 解决方法

    MySQL ERROR 1366(HY000):Incorrect string value,在往数据库中插入中文的时候会出现. 这也就是编码问题,网上大部分都是说设置下配置文件中的设置,而可悲的是在 ...

  9. mysql insert 1366_mysql insert中文乱码无法插入ERROR 1366 (HY000): Incorrect string value

    MYSQL经典问题: (ERROR 1366 (HY000): Incorrect string value:'\xD5\xD4' for column 'name' at row 1) 网上有好多解 ...

最新文章

  1. Ubuntu 64 位下解决bash: xxx: 没有那个文件或目录
  2. mongooseim xmpp 服务器docker 安装试用
  3. 强大的.NET反编译工具Reflector及插件(转载)
  4. warframe怒焚者结合目标_【虚荣盒子】设计目标和功能规划
  5. Linux学习日志--共享内存
  6. hadoop安装和基本知识
  7. C++Builder 2010深入TForm类之属性
  8. 信号与系统——有关卷积的意义
  9. 第十一届蓝桥杯校园赛---原题+解析+答案
  10. php 实现rpc,使用php链接jsonrpc服务
  11. iOS开发:Protocol协议以及委托代理传值
  12. 【Python函数综合实例】
  13. 【魅力开源】第3集:聊个轻松点的话题,如何把给员工发生日贺卡这个事变得有人情味点?关于Odoo的自动化邮件系统
  14. 计算机网络题库——第3章数据链路层
  15. RF射频信号,高速信号能将电源平面作为参考平面吗?
  16. office16PowerPoint发现内容有问题
  17. linux cadaver 命令,备份Linux系统的数据到坚果云
  18. 1.可编程并行接口实验
  19. 如何用js实现简单的页面html动态加载(“看更多“/页面折叠功能)
  20. 阿里云的学生机服务器

热门文章

  1. 中国连接器行业运营状况分析与未来投资方向研究报告2022-2028年版
  2. 亚马逊全球站点之中东站
  3. Android动画开发思路
  4. Linux获取root权限
  5. Intervals on the Ring(多校6 I题)
  6. ftp端口号20和21的区别是什么?
  7. ProSpec CD9 人重组体,Sf9解决方案
  8. GD32E230 printf 之 J-LINK RTT Viewer
  9. Majorbio Cloud:一站式多组学数据分析平台
  10. WLAN部署(AC+AP)配置及常见问题记录