Mysql中的load语句对null的处理

来源:互联网 发布:it行业 云计算 编辑:程序博客网 时间:2024/05/01 19:15

Load语法

LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE]          INTO TABLE tbl_name          [FIELDS              [TERMINATED BY '\t']              [OPTIONALLY] ENCLOSED BY '']              [ESCAPED BY '\\' ]]          [LINES TERMINATED BY '\n']          [IGNORE number LINES]          [(col_name,...)]  

  LOAD DATA INFILE语句从一个文本文件中以很高的速度读入一个表中。如果指定LOCAL关键词,从客户主机读文件。如果LOCAL没指定,文件必须位于服务器上。(LOCAL在MySQL3.22.6或以后版本中可用。)
  为了安全原因,当读取位于服务器上的文本文件时,文件必须处于数据库目录或可被所有人读取。另外,为了对服务器上文件使用LOAD DATA INFILE,在服务器主机上你必须有file的权限。

代码举例:

load data local infile 'jingo.csv' into table th_dept_city_day_order_sum fields terminated by '\\t' enclosed by '' lines terminated by '\\n' (id,row_hash,province_id,province_name,city_id,city_name,complaint_num,order_num,order_date,order_year_week,order_year_mon,business_source,bu_code,bu_name,dept_id_1,dept_name_1,dept_id_2,dept_name_2,dept_id_3,dept_name_3)

NULL 值的处理有很多,取决于用户所使用的FIELDS 和LINES 选项:
对于缺省的FIELDS 和LINES 值,输出时,NULL 被写成\N,当读入时,\N 被作为NULL 读入(假设ESCAPED BY 字符为 “\”)。

问题描述:

  在导入时候,有时候给的数据并不规范,如null的字段在csv文件里用N表示(正确格式应该为\N),下面截图
这里写图片描述 
  此时采用默认的load语句,在mysql中字段为varchar时候就会存储N值,而如果为int类型时候则直接报错。 

解决办法:

(1) 生成csv文件时候手动判断null,如果为null赋值对应的默认值。
(2) Load语句添加参数 escaped by ‘N’ ,并且不能添加replace关键字,此时,int类型的存储默认值,varchar类型的存储空字符串。
如load语句

load data local infile 'jingo.csv' into table th_dept_city_day_order_sum fields terminated by '\\t' enclosed by '' escaped by 'N' lines terminated by '\\n' (id,row_hash,province_id,province_name,city_id,city_name,complaint_num,order_num,order_date,order_year_week,order_year_mon,business_source,bu_code,bu_name,dept_id_1,dept_name_1,dept_id_2,dept_name_2,dept_id_3,dept_name_3)

说明:
  ENCLOSED BY参数,说明fields中每个字段被参数字符包围,在load数据入表时候,会去除ENCLOSED BY参数字符,此时截图中的N就变成了空字符,此时如果为varchar字符串则赋值,如果为int或其他类型则赋值默认值。
  如果添加replace关键字,空字符串遇到varchar类型能正常赋值,而空字符串遇到int等类型,直接报错了,所以此时还需要手动赋默认值。
(3) 在不需要覆盖更新的功能的话(即不用replace关键字),最优化的脚本解决方案(2),如果需要覆盖功能的话(即用replace关键字),建议int类型等字段手动赋值默认值,有助于特殊警示作用(有些mysql的默认值不太理想,如日期等),varchar字段自动赋值空字符串。
不需要自动更新的load语句

load data local infile 'jingo.csv' into table th_dept_city_day_order_sum fields terminated by '\\t' enclosed by '' escaped by 'N' lines terminated by '\\n' (id,row_hash,province_id,province_name,city_id,city_name,complaint_num,order_num,order_date,order_year_week,order_year_mon,business_source,bu_code,bu_name,dept_id_1,dept_name_1,dept_id_2,dept_name_2,dept_id_3,dept_name_3)

需要自动更新的load语句

load data local infile 'jingo.csv' replace into table th_dept_city_day_order_sum fields terminated by '\\t' enclosed by '' escaped by 'N' lines terminated by '\\n' (id,row_hash,province_id,province_name,city_id,city_name,complaint_num,order_num,order_date,order_year_week,order_year_mon,business_source,bu_code,bu_name,dept_id_1,dept_name_1,dept_id_2,dept_name_2,dept_id_3,dept_name_3)
0 0
原创粉丝点击