如何从CSV获取SQL LOAD DATA以在加载时遵守列类型?

时间:2010-01-06 22:10:43

标签: sql mysql jdbc load-data-infile sqlexception

我使用CREATE TABLELOAD DATA将CSV文件加载到MySQL(5.1)中。我有许多列是文本类型(类别)但包含数值。当我创建表时,我将这些列分配为VARCHAR(254),但JDBC驱动程序抛出SQLException“第1行的AgeGroup列数据被截断”。

我的数据如下:

ID,AgeGroup
xxx,4
xxy,3
xyx,6
...

我的create table语句如下所示

CREATE TABLE abc(ID VARCHAR(254), AgeGroup VARCHAR(254))

我的加载语句如下所示

LOAD DATA INFILE \myfile.csv\ INTO TABLE abc FIELDS TERMINATED BY ','

我猜这是一个类型转换问题,因为AgeGroup是一个文本数据库列,但我坚持看似数字的内容。

我如何 - 我可以 - 强制LOAD DATA命令遵守列的数据类型并转换文件的内容吗?

我正在使用官方的MySQL JDBC驱动程序。

1 个答案:

答案 0 :(得分:1)

我很惊讶这不起作用。我的意思是,当在数字列中粘贴字符串值时,我会期望这种行为 - 而不是相反。

无论如何,您可以使用v5.0中引入的LOAD DATA语法的扩展来计算原始数据中的任意表达式:

LOAD DATA INFILE \myfile.csv\ 
INTO TABLE abc 
FIELDS TERMINATED BY ','
(@ID, @AgeGroup)
SET ID = @ID
,   AgeGroup = CAST(@AgeGroup AS UNSIGNED)

(见:http://dev.mysql.com/doc/refman/5.1/en/load-data.html