导入.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"。