我正在制作一个程序,我将从txt文件中读取数据并将它们存储在mysql中的表中。在我的程序中,我使用我想要的字段创建表,然后使用“加载数据Infile”命令,我将值插入表中。
我所拥有的文件包含一列(命名为升)
数据是浮点数,如
0,234
12234
3,004等。
在我创建表的程序开始时,liters字段被描述为FLOAT。但是当我运行我的程序时,我得到SQLException : Data truncated for column 'litres' at row 1.
创建表格和插入值的代码如下:
private static String getCreateTable1(Connection con, String tablename) {
try {
Class.forName("com.mysql.jdbc.Driver");
Statement stmt = con.createStatement();
String createtable = "CREATE TABLE " + tablename
+ " ( text VARCHAR(255), price INT , day VARCHAR(255), litres FLOAT )";
System.out.println("Create a new table in the database");
stmt.executeUpdate(createtable);
} catch (Exception e) {
System.out.println(((SQLException) e).getSQLState());
System.out.println(e.getMessage());
e.printStackTrace();
}
return null;
}
private static String importData(Connection con, File txtFile,
String tablename) {
try {
Statement stmt;
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
String path = txtFile.getAbsolutePath();
String importingdata = "LOAD DATA INFILE '"
+ path.replace('\\', '/')
+ "' INTO TABLE " + tablename
+ " FIELDS TERMINATED BY '\t'";
System.out.println("fill the table");
stmt.executeUpdate(importingdata);
} catch (Exception e) {
System.out.println(((SQLException) e).getSQLState());
System.out.println(e.getMessage());
e.printStackTrace();
}
return null;
}
我该如何解决?谁能帮助我?我认为问题是逗号?我怎样才能让它识别出来?
答案 0 :(得分:1)
解析十进制数是特定于语言环境的。在将其提供给MySQL之前,您需要更改语句以用逗号字符','
替换点字符'.'
。一种方法是在LOAD DATA INFILE
语句中添加强制转换:
LOAD DATA INFILE 'myfile.txt'
INTO TABLE tablename
FIELDS TERMINATED BY '\t'
(COL1, @litres, COL3, ...) -- Note the @ in front of the float column
SET litres = REPLACE(@litres, ',', '.')
您需要列出要导入的所有列。您“按原样”导入的列需要列出,而不是“at”符号@
;必须使用“at”符号@
列出必须用点替换逗号的列。对于每个浮点列,您需要在最后一行添加replace
调用。
答案 1 :(得分:0)
此异常表示您插入litres
列的值大于列可容纳的值。查看您提到的值似乎是您使用liters
作为varchar
,请检查您是否有尺寸限制。
更新表以允许所需的值。
答案 2 :(得分:0)
可能是您的文件中有空记录,即抛出错误消息。
在此处查看类似问题:Getting a mysql Error Code: 1265. Data truncated for column when doing a LOAD DATA LOCAL INFILE