mysql语句在客户端正常执行,但写入sql文件并用source执行时却报错:ERROR 1406 (22001): Data too long for column ‘gender‘ at row

导入.sql文件命令(例如 D:\mysql.sql )时,一般有两种方法:

1、未登录数据库时,在MySQL的bin目录下导入:mysql -u 用户名 -p 数据库名 < sql文件目录

2、已经登录MySQL数据库,使用source命令导入:source sql文件目录

实例

有一个mysql.sql文件,里面的命令很简单,作用就是创建一个user0表,然后往表中插入三行数据。文件内容如下:

create table user0(
	id int not null auto_increment primary key,
	name varchar(64),
	gender char(1)
	)default charset=utf8;     -- 创建表,有三列:id、名字、性别。

insert into user0(id,name,age,gender) values(1,"aaa","男"),(2,"bbb","男"),(3,"ccc","女");   -- 插入数据。

先在MySQL客户端执行这些命令,确保这些命令是正确的:

mysql>-- 先创建一个数据库用于实验。
mysql> create database day16 default charset utf8 collate utf8_general_ci; -- 创建一个数据库day16
Query OK, 1 row affected, 2 warnings (0.04 sec)

mysql> use day16;  -- 进入day16数据库
Database changed
mysql>-- 下面开始验证mysql.sql文件内的命令是否正确。
mysql> create table user0(
    -> id int not null auto_increment primary key,
    -> name varchar(64),
    -> gender char(1)
    -> )default charset=utf8;     -- 创建表,有三列:id、名字、性别。
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> insert into user0(id,name,gender) values(1,"aaa","男"),(2,"bbb","男"),(3,"ccc","女");   -- 插入数据。
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> select * from user0;
+----+------+--------+
| id | name | gender |
+----+------+--------+
|  1 | aaa  | 男     |
|  2 | bbb  | 男     |
|  3 | ccc  | 女     |
+----+------+--------+
3 rows in set (0.00 sec)

mysql>-- 可以看到,上面的命令都正确执行了,没有报错。

经过上面的验证得知,mysql.sql文件里面的所有命令都可以正常在MySQL客户端中执行,接下来尝试用两种不同的方法导入mysql.sql文件。

一、source sql文件目录

因为上面的验证过程中,我已经进入了day16数据库,所以就先验证source命令导入了。

mysql> drop table user0;   -- 先把之前验证过程中创建的表user0删除。
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
Empty set (0.00 sec)
mysql> -- 可以看到day16数据库已经是空的了。

mysql> source D:/mysql.sql;     -- source导入sql文件。
Query OK, 0 rows affected, 1 warning (0.02 sec)

ERROR 1406 (22001): Data too long for column 'gender' at row 1
mysql>-- 从上面的执行结果可以看出,第一条命令(创建表的命令)执行成功了,但是第二条命令(插入数据的命令)报错了,原因是第一行的'gender'列的数据长度超出限制。


用source命令导入sql文件有报错,说是'gender'列的数据长度超出限制。但实际上应该是没有超的,因为我之前在MySQL客户端上验证了这些命令都是可以正确执行的,但用source导入就是会报错。

这里我还试了很多种方法,比如把gender列的字符限制由char(1)改为char(100),甚至改为varchar(1000),但只要是用source导入,都还是报这个错误。

这里直接说结论:只要mysql.sql文件的插入或更新命令中有中文,用source命令导入sql文件,就会报错。报错都是这种形式:ERROR 1406 (22001): Data too long for column 'gender' at row 1

sql文件内的查询和删除命令中有中文,用source导入sql文件,虽然不会报错,但是命令会匹配不到正确的内容,导致命令起不到相应的作用。 

将mysql.sql的所有内容都改为英文后,用source导入该文件不再报错。

mysql> drop table user0;   -- 因为上次用source导入sql文件的时候,创建表user0的命令正确执行了,所以这里要先把表删除。
Query OK, 0 rows affected (0.02 sec)

mysql> source D:/mysql.sql;     -- source导入sql文件。
Query OK, 0 rows affected, 1 warning (0.05 sec)

Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from user0;
+----+------+--------+
| id | name | gender |
+----+------+--------+
|  1 | aaa  | M      |
|  2 | bbb  | M      |
|  3 | ccc  | F      |
+----+------+--------+
3 rows in set (0.00 sec)

mysql>-- 可以看到,全英文的mysql.sql文件导入成功,没有报错,也成功的插入数据到表中。

 二、mysql -u 用户名 -p 数据库名 < sql文件目录

将mysql.sql文件插入命令的内容改回中文。

 可以看到,mysql -u root -p day16 < D:/mysql.sql     这种方法导入mysql.sql文件也是报错:ERROR 1406 (22001): Data too long for column 'gender' at row 1

mysql> drop table user0;   -- 再次把表user0删除。
Query OK, 0 rows affected (0.04 sec)

mysql> exit  -- 退出MySQL客户端
Bye

C:\Users\ljm12580963>mysql -u root -p day16 < D:/mysql.sql
Enter password: ****
ERROR 1406 (22001) at line 10: Data too long for column 'gender' at row 1

但是,这次不用改英文了,因为mysql命令可以设置编码格式,如下:

mysql -u root -p --default-character-set=utf8 day16 < D:/mysql.sql

C:\Users\ljm12580963>mysql -u root -p --default-character-set=utf8 day16 < D:/mysql.sql
Enter password: ****
-- 没有报错,也没有任何反馈,好像什么都没有发生,但其实sql文件已经导入成功了,下面进入MySQL客户端查看验证。
C:\Users\ljm12580963>mysql -u root -p
Enter password: ****

mysql> use day16
Database changed
mysql> select * from user0;   -- 可以看到,中文数据也写入成功了。
+----+------+--------+
| id | name | gender |
+----+------+--------+
|  1 | aaa  | 男     |
|  2 | bbb  | 男     |
|  3 | ccc  | 女     |
+----+------+--------+
3 rows in set (0.00 sec)

mysql>

 三、总结

1、使用     source sql文件目录    导入sql文件,文件内的所有命令必须是英文,否则命令报错或无效。

2、使用   mysql -u 用户名 -p 数据库名 < sql文件目录    导入sql文件,如果命令中有中文,需要在"-p"后面加上"--default-character-set=utf8"以保证数据库编码和sql文件编码一致,都为utf8编码,这样就能正常导入sql文件了。

3、sql文件内的命令全是英文,就用source导入,方便快捷;如果命令中含有中文,就用另一种方法导入,记得加上选项"--default-character-set=utf8"。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值