zoukankan      html  css  js  c++  java
  • 关于MySQL中使用LOAD DATA INFILE导入csv文件时的日期格式问题

    在使用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表中,如下图:
    关于MySQL中使用LOAD <wbr>DATA <wbr>INFILE导入csv文件时的日期格式问题
    可以看到两个文件仅有生日的格式不同,我们对两个文件分别用load data local infile进行导入测试,结果如下:
    关于MySQL中使用LOAD <wbr>DATA <wbr>INFILE导入csv文件时的日期格式问题
    关于MySQL中使用LOAD <wbr>DATA <wbr>INFILE导入csv文件时的日期格式问题
    可以看到test1.txt中的形如%Y-%m-%d格式的日期可以被正确导入,而test2.txt中的形如%m/%d/%Y格式的日期无法被正确导入,提示数据被截断。
     
    检查一下与date有关的系统变量如下:
    关于MySQL中使用LOAD <wbr>DATA <wbr>INFILE导入csv文件时的日期格式问题
    发现mysql中date_format的默认值是%Y-%m-%d,尝试修改该变量的值,返回如下错误:
    mysql> set date_format='%m/%d/%Y';
    ERROR 1238 (HY000): Variable 'date_format' is a read only variable
    那么我们直接在配置文件my.ini中设置该值,重启mysql服务,成功修改了date_format的值:
    关于MySQL中使用LOAD <wbr>DATA <wbr>INFILE导入csv文件时的日期格式问题
    重新导入test2.txt,本以为可以正常导入,结果却和原来一样,连显示格式都没有变:
    mysql> select * from people;
    +------+------------+-----+
    | name | birthday   | age |
    +------+------------+-----+
    | Lily | 0000-00-00 |  25 |
    | Lucy | 0000-00-00 |  23 |
    +------+------------+-----+
    2 rows in set (0.00 sec)
    百度一下据说这个变量已经被mysql抛弃了…………
     
    那么问题来了,如何正确导入非默认格式的date数据呢?
    尝试了一下大概有三个办法:
    1.使用编辑软件将csv文件中的日期格式转换成mysql默认的日期格式,然后再导入;
    2.使用某些第三方软件进行导入,如navicat,自带日期格式转换功能;
    3.在load data local infile语句中使用STR_TO_DATE函数进行转换:
    关于MySQL中使用LOAD <wbr>DATA <wbr>INFILE导入csv文件时的日期格式问题
    个人推荐使用第三种方法,实际测试命令行下导入数据比通过客户端软件导入速度快太多了。
  • 相关阅读:
    php冒泡排序和快速排序
    在thinkphp中js文件添加路径
    cookiesession
    搭建nginx环境(参考腾讯云实验室)
    验证码快速刷新
    使用Word发送,测试一下
    c++ DLL和c#之间传递字符串
    如何使CEF支持Flash
    如何在Windows上从源码编译Chromium (CEF3) 加入mp3支持
    C#在Linux+Mono环境中使用微信支付证书
  • 原文地址:https://www.cnblogs.com/jukan/p/5180859.html
Copyright © 2011-2022 走看看