MySQL error:ERROR 1366 (HY000): Incorrect string value: ‘xxxxx’ for column ‘xxxxx’ at row xxx
错误如题所示,发生在向MySQL导入“*.sql”的过程中。
具体场景如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
PS G:\搜狗高速下载\mysql-5.7.10-winx64\bin> .\mysql.exe -u root -p Enter password: ****** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 5.7.10 MySQL Community Server (GPL) Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) mysql> mysql> create database character_set_test; Query OK, 1 row affected (0.00 sec) mysql> mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | character_set_test | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> use character_set_test; Database changed mysql> show tables; Empty set (0.00 sec) mysql> mysql> source "g:\temp\student2where_db.sql" ERROR: Failed to open file '"g:\temp\student2where_db.sql"', error: 22 mysql> mysql> source g:\temp\student2where_db.sql Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.34 sec) Query OK, 1 row affected (0.06 sec) Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.48 sec) ERROR 1366 (HY000): Incorrect string value: '\xAA\xE8\x8F\xB2\xE8\x8F...' for column 'studentName' at row 1 Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.40 sec) ERROR 1366 (HY000): Incorrect string value: '\xAD\xA6' for column 'collegeName' at row 1 Query OK, 1 row affected (0.05 sec) ERROR 1366 (HY000): Incorrect string value: '\xAD\xA6' for column 'collegeName' at row 1 ERROR 1366 (HY000): Incorrect string value: '\xAD\xA6' for column 'collegeName' at row 1 Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.46 sec) ERROR 1406 (22001): Data too long for column 'studentName' at row 1 ERROR 1406 (22001): Data too long for column 'studentName' at row 1 Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.46 sec) ERROR 1406 (22001): Data too long for column 'studentName' at row 1 Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.54 sec) ERROR 1406 (22001): Data too long for column 'studentName' at row 1 ERROR 1406 (22001): Data too long for column 'studentName' at row 1 Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.54 sec) ERROR 1406 (22001): Data too long for column 'studentName' at row 1 Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.33 sec) ERROR 1366 (HY000): Incorrect string value: '\xA7\x91\xE5\xAD\xA6\xE4...' for column 'professionName' at row 1 ERROR 1366 (HY000): Incorrect string value: '\xAF\xAD' for column 'professionName' at row 1 ERROR 1366 (HY000): Incorrect string value: '\xAE\xA1' for column 'professionName' at row 1 Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.31 sec) ERROR 1406 (22001): Data too long for column 'provinceName' at row 1 ERROR 1406 (22001): Data too long for column 'provinceName' at row 1 Query OK, 1 row affected (0.06 sec) Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.45 sec) ERROR 1406 (22001): Data too long for column 'studentName' at row 1 Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.48 sec) ERROR 1406 (22001): Data too long for column 'studentName' at row 1 Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.33 sec) ERROR 1406 (22001): Data too long for column 'yearName' at row 1 ERROR 1406 (22001): Data too long for column 'yearName' at row 1 mysql> |
如上,可以看到导入数据的过程中,有大量的:
1. ERROR 1366 (HY000): Incorrect string value
2. ERROR 1406 (22001): Data too long for column
这样的错误。
该错误的产生原因是因为:
MySQL的导入目标库与源库的字符集不同。
看看数据导入的情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | character_set_test | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> use character_set_test; Database changed mysql> mysql> show tables; +------------------------------+ | Tables_in_character_set_test | +------------------------------+ | admin | | t_armystudent | | t_collegeinfo | | t_entrepreneurstudent | | t_getjobstudent | | t_graduatestudent | | t_otherstudent | | t_professioninfo | | t_provinceinfo | | t_servantstudent | | t_underemployedstudent | | t_yearinfo | +------------------------------+ 12 rows in set (0.00 sec) mysql> desc admin; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | username | varchar(20) | NO | PRI | NULL | | | password | varchar(20) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> desc t_armystudent; +---------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+-------------+------+-----+---------+----------------+ | studentId | int(11) | NO | PRI | NULL | auto_increment | | studentName | varchar(20) | YES | | NULL | | | sex | varchar(20) | YES | | NULL | | | professionObj | int(11) | YES | MUL | NULL | | | nianji | varchar(20) | YES | | NULL | | | yearObj | int(11) | YES | MUL | NULL | | | provinceObj | int(11) | YES | MUL | NULL | | +---------------+-------------+------+-----+---------+----------------+ 7 rows in set (0.00 sec) mysql> mysql> select * from t_armystudent; Empty set (0.00 sec) mysql> select * from admin; +----------+----------+ | username | password | +----------+----------+ | a | a | +----------+----------+ 1 row in set (0.00 sec) mysql> |
可以看到admin表的数据导入了,但是t_armystudent的数据却没有导入成功。
SQL脚本中对于这两个表的插入行为是这样定义的:
admin
如上,
英文字符集,导入成功。
中文字符集,导入失败。
目标库(当前出问题的库)的字符集:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
mysql> status -------------- G:\搜狗高速下载\mysql-5.7.10-winx64\bin\mysql.exe Ver 14.14 Distrib 5.7.10, for Win64 (x86_64) Connection id: 8 Current database: character_set_test Current user: root@::1 SSL: Not in use Using delimiter: ; Server version: 5.7.10 MySQL Community Server (GPL) Protocol version: 10 Connection: localhost via TCP/IP Server characterset: gbk Db characterset: gbk Client characterset: gbk Conn. characterset: gbk TCP port: 3306 Uptime: 35 min 36 sec Threads: 1 Questions: 93 Slow queries: 0 Opens: 121 Flush tables: 1 Open tables: 114 Queries per second avg: 0.043 -------------- mysql> mysql> show variables like 'character%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | character_set_client | gbk | | character_set_connection | gbk | | character_set_database | gbk | | character_set_filesystem | gbk | | character_set_results | gbk | | character_set_server | gbk | | character_set_system | utf8 | | character_sets_dir | G:\ | +--------------------------+-------+ 8 rows in set, 10 warnings (0.00 sec) mysql> |
如上,当前库(目标库)的字符集是:GBK。
关于MySQL中的字符集参数:
character_set_client,客户端使用的字符集
character_set_connection,连接数据库的字符集。如果没有程序没有指定连接数据库的字符集,则使用服务器默认的字符集。
character_set_database,对MySQL中特定的数据库设置的字符集。如果数据库艰苦的时候没有指定,则按照默认字符集应用。
character_set_results,MySQL返回客户端结果集的时候使用的字符集。如果没有指定,使用服务器默认字符集。
character_set_server,服务器默认字符集(安装MySQL的时候指定的)
character_set_system,数据库系统使用的字符集。
关于字符集:
UTF8,几乎所有字符
GB2312,简体中文
GBK,简体中文 + 繁体中文
解决方法:
解决MySQL字符集的问题的方法有很多种。
第一种:修改数据库的字符集:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
mysql> alter database character_set_test character set=utf8; Query OK, 1 row affected (0.00 sec) mysql> use character_set_test; Database changed mysql> show variables like 'character%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | character_set_client | gbk | | character_set_connection | gbk | | character_set_database | utf8 | | character_set_filesystem | gbk | | character_set_results | gbk | | character_set_server | gbk | | character_set_system | utf8 | | character_sets_dir | G:\ | +--------------------------+-------+ 8 rows in set, 10 warnings (0.00 sec) mysql> |
可以看到,“alter database … character set … ”改变的其实是以下两个参数的值:
1. character_set_database
2. character_set_system
你也可以直接去修改这两个参数的值。
第二种:
修改MySQL配置文件my.ini中的:
character-set-server
character_set_filesystem
default-character-set
修改后的my.ini文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[mysqld] basedir = "G:\搜狗高速下载\mysql-5.7.10-winx64" datadir = "G:\搜狗高速下载\mysql-5.7.10-winx64\data" port = 3306 character-set-server = utf8 character_set_filesystem = utf8 #跳过密码验证 skip-name-resolve [client] port = 3306 default-character-set = utf8 [mysqld_safe] timezone = "CST" [mysql] default-character-set = utf8 |
然后,重启MySQL服务。
——————————————————————
字符集修改好后,重新执行导入操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 |
mysql> status -------------- G:\搜狗高速下载\mysql-5.7.10-winx64\bin\mysql.exe Ver 14.14 Distrib 5.7.10, for Win64 (x86_64) Connection id: 2 Current database: Current user: root@::1 SSL: Not in use Using delimiter: ; Server version: 5.7.10 MySQL Community Server (GPL) Protocol version: 10 Connection: localhost via TCP/IP Server characterset: utf8 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8 TCP port: 3306 Uptime: 13 sec Threads: 1 Questions: 5 Slow queries: 0 Opens: 105 Flush tables: 1 Open tables: 98 Queries per second avg: 0.384 -------------- mysql> mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | character_set_test | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> create database character_db; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | character_db | | character_set_test | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.00 sec) mysql> mysql> use character_db; Database changed mysql> mysql> show tables; Empty set (0.00 sec) mysql> mysql> source g:\temp\student2where_db.sql Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.71 sec) Query OK, 1 row affected (0.05 sec) Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.45 sec) Query OK, 1 row affected (0.05 sec) Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.32 sec) Query OK, 1 row affected (0.06 sec) Query OK, 1 row affected (0.05 sec) Query OK, 1 row affected (0.16 sec) Query OK, 1 row affected (0.05 sec) Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.49 sec) Query OK, 1 row affected (0.05 sec) Query OK, 1 row affected (0.05 sec) Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.37 sec) Query OK, 1 row affected (0.06 sec) Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.49 sec) Query OK, 1 row affected (0.05 sec) Query OK, 1 row affected (0.06 sec) Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.51 sec) Query OK, 1 row affected (0.06 sec) Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.28 sec) Query OK, 1 row affected (0.05 sec) Query OK, 1 row affected (0.05 sec) Query OK, 1 row affected (0.05 sec) Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.29 sec) Query OK, 1 row affected (0.05 sec) Query OK, 1 row affected (0.05 sec) Query OK, 1 row affected (0.10 sec) Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.50 sec) Query OK, 1 row affected (0.06 sec) Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.43 sec) Query OK, 1 row affected (0.05 sec) Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.35 sec) Query OK, 1 row affected (0.05 sec) Query OK, 1 row affected (0.05 sec) mysql> mysql> show tables; +------------------------+ | Tables_in_character_db | +------------------------+ | admin | | t_armystudent | | t_collegeinfo | | t_entrepreneurstudent | | t_getjobstudent | | t_graduatestudent | | t_otherstudent | | t_professioninfo | | t_provinceinfo | | t_servantstudent | | t_underemployedstudent | | t_yearinfo | +------------------------+ 12 rows in set (0.00 sec) mysql> select * from admin; +----------+----------+ | username | password | +----------+----------+ | a | a | +----------+----------+ 1 row in set (0.00 sec) mysql> select * from t_armystudent; +-----------+-------------+------+---------------+---------+---------+-------------+ | studentId | studentName | sex | professionObj | nianji | yearObj | provinceObj | +-----------+-------------+------+---------------+---------+---------+-------------+ | 1 | 汪菲菲 | 女 | 2 | 2010级 | 1 | 1 | +-----------+-------------+------+---------------+---------+---------+-------------+ 1 row in set (0.00 sec) mysql> |
可以看到,这时候就没问题了
——————————————————————
Done。
MySQL的命令行的结果,黏贴到Wordpress的代码高亮中之后,格式有一点点混乱,… 感觉很不舒服。如果格式能够保留和命令行中的展示一致,就很完美了。(强迫症)