【问题标题】:Why is my data being truncated?为什么我的数据被截断?
【发布时间】:2023-10-19 02:40:02
【问题描述】:

我对 MySQL/SQL 比较陌生,这是我在这个网站上的第一篇文章,所以如果我对这个问题的表述不当,我深表歉意。

我将 .xlsx 文件的副本保存为 .csv 文件。我正在尝试将该 .csv 文件中的数据加载到表中。我收到以下错误消息:

0 行受影响,64 个警告:1265 列的数据被截断 第 1 行的“ptsg”

此处的错误日志:http://pastie.org/private/byzcwjtslxpfjyhoog2g

在此查询:http://pastie.org/private/tyzkbyqnuwpsafrjxcetq#6,8,12-13

我尝试过使用“ptsg”列数据类型,将其从浮点数更改为十进制,但没有运气。

插入该列的数据最多为 4 个有效数字,形式为“100”或“100.2”,小数点前最多有 1 个数字。

我还有其他浮点列可以很好地处理“0.347”之类的数据。为什么我的数据会被截断?

以下是 .csv 格式的三行数据:

2013掘金,2013,1,丹佛,掘金,丹佛掘金,82,19705,3145,6613,0.476,662,1704,0.388,1859,2429,0.765,791,2652,3443,1813,605,352,1157,1719,81 ,107.5 2013尼克斯,2013,2,纽约,尼克斯,纽约尼克斯,82,19780,3140,6867,0.457,765,2081,0.368,1689,2087,0.809,847,2470,3317,1757,625,475,1123,1743 ,8734,106.5 2013火箭,2013,3,休斯顿,火箭,休斯顿火箭,82,19880,3170,6975,0.454,677,1843,0.367,1668,2083,0.801,962,2549,3511,1955,581,371,1110,1641,8658 ,105.9 2013太阳,2013,4,凤凰,太阳,凤凰太阳,82,20005,3219,6844,0.47,701,1857,0.377,1472,1939,0.759,821,2478,3299,1945,545,357,1169,1666,8611 ,105

查询输出:SHOW WARNINGS;

注 1265 第 1 行的“ptsg”列的数据被截断 注 1265 第 2 行的“ptsg”列的数据被截断 注释 1265 第 3 行的“ptsg”列的数据被截断 注释 1265 第 5 行的“ptsg”列的数据被截断 ...

更新:

感谢 peterm,我注意到我对列 'ptsg' 错误地使用了“十进制”数据类型。我使用 DECIMAL(10,0) 而不是 (10,1)。我的 64 条警告已减少到 1 条。

0 行受影响,1 个警告:1366 不正确的十进制值:第 1246 行的列 'ptsg' 记录:1334 已删除:0 跳过:1334 警告:1

第 1246 行有 ptsg 的空白。我上面的查询(具体来说,ptsg = NULLIF(@vptsg,''))应该?将第 1246 行的“NULL”插入 ptsg 列。我检查了表格,ptsg 列 DECIMAL(10,1) 应该允许 NULL 值,因为我没有选中“NN”或“Not Null”复选框。

第 1246 行如下所示: 1955Bullets,1955,9,Baltimore,Bullets,Baltimore Bullets,,,,,,,,,,,,,,,,,,,,,,

我又犯了一个愚蠢的错误吗?

【问题讨论】:

  • 阅读此内容并将输出粘贴到您的问题中:dev.mysql.com/doc/refman/5.7/en/show-warnings.html
  • 请显示警告中提到的几行(例如 1 和 2)
  • 这列'ptsg'是什么数据?
  • 如前所述,我们需要知道数据类型的细节,但也有可能值是负数并且 col 是unsigned - 尽管这可能会产生稍微不同的数据错误。仍然值得检查
  • Edit 您的问题并将数据放入其中或使用外部资源,就像您对 pastie.org 所做的那样,并在您的问题中发布链接

标签: mysql truncate load-data-infile


【解决方案1】:

尝试在 csv 文件的每一行的最后一列之后添加一个尾随逗号。 (或者只是几行作为测试。)

我认为问题在于 csv 中的最后一个字段没有以逗号结尾,这导致将 NULL 分配给 @vptsg

如果文件是 DOS 格式,你也可以尝试指定

  LINES TERMINATED BY '\r\n' 

【讨论】:

  • 感谢您的努力和这个建议。但是,我的 .csv 文件是从 .xlsx 文件生成的。是否有另一种解决方案,我不必修补中间产品 .csv 文件,而是通过更好/正确的 SQL 查询来补救这种情况?