在使用MySQL时,常常会用到Load Data Infile来导入数据,在遇到Date类型的列时,有时会遇到格式转换的问题:
首先创建一张简单的people表,包含名字,生日,年龄三个字段:
mysql> create table people(
-> name varchar(10) NOT NULL,
-> birthday date NOT NULL,
-> age int NOT NULL);
Query OK, 0 rows affected (0.18 sec)
构造两个测试文件,导入到people表中,如下图:
可以看到两个文件仅有生日的格式不同,我们对两个文件分别用load data local infile进行导入测试,结果如下:
检查一下与date有关的系统变量如下:
mysql> set date_format='%m/%d/%Y';
ERROR 1238 (HY000): Variable 'date_format' is a read only variable
那么我们直接在配置文件my.ini中设置该值,重启mysql服务,成功修改了date_format的值:
mysql> select * from people;
+------+------------+-----+
| name | birthday | age |
+------+------------+-----+
| Lily | 0000-00-00 | 25 |
| Lucy | 0000-00-00 | 23 |
+------+------------+-----+
2 rows in set (0.00 sec)
那么问题来了,如何正确导入非默认格式的date数据呢?
尝试了一下大概有三个办法:
1.使用编辑软件将csv文件中的日期格式转换成mysql默认的日期格式,然后再导入;
2.使用某些第三方软件进行导入,如navicat,自带日期格式转换功能;
3.在load data local infile语句中使用STR_TO_DATE函数进行转换:
个人推荐使用第三种方法,实际测试命令行下导入数据比通过客户端软件导入速度快太多了。