【问题标题】:Data truncuated for a column error with PHP and mySQL?PHP 和 mySQL 因列错误而截断数据?
【发布时间】:2017-06-02 19:02:35
【问题描述】:

我在 PHP 上编写了以下代码,但出现错误: 第 1 行的“datetime_gmt”列的数据被截断;

代码如下:

$lines = new SplFileObject('/home/file.txt');
$x = 0;
while(!$lines->eof()) {
    $lines->next();
    if($x == 0){
        $lines->next();
    }
    $row = explode(',',$lines);
    for($i = 0; $i<4; $i++){
        if(!isset($row[$i])){
            $row[$i] = null;
        }
    }
    $y = (float) $row[1];
    $z = (float) $row[2];
    $load_query = "INSERT IGNORE INTO new (datetime_gmt,field2,field3)
    VALUES ('".$row[0]."','".$y."','".$z."');";
    $x++;
}
$lines = null;

该列的类型为“日期时间”,默认为“0000-00-00 00:00:00”,它是表的优先级。如果您想知道“x”变量,它是为了跳过前 2 行。

编辑 1

这是一个示例数据:

2013-12-11 8:22:00, 1.462E+12, 3.33E+11 
2013-12-12 4:10:00, 1.462E+12, 3.33E+11 
2013-12-13 11:52:00, 1.462E+12, 3.33E+11 

这里是对“新”表的描述:

Field         | Type      | Null  | Key  | Default            | Extra
datetime_gmt  | datetime  |No     | PRI  |0000-00-00 00:00:00 |
field2        | bigint(20)|YES    |      |NULL                |
field3        | bigint(20)|YES    |      |NULL                |

使用:

SELECT sum(char_length(COLUMN_NAME)) 
FROM TABLE_NAME;

我得到 19 作为列的大小。

【问题讨论】:

  • 但是那个答案说将列类型更改为varchar。我不能保留它的日期时间吗?
  • if($x = 0) 你在这里分配,而不是比较 == / === 并且将始终被视为0
  • 您尝试插入的第一行的值是多少?你能发布数据吗?

标签: php mysql truncate


【解决方案1】:

请直接在您的数据库中运行此查询:INSERT IGNORE INTO new (datetime_gmt,field2,field3) VALUES ('2013-12-11 8:22:00','1462000000000','333000000000');

如果没有添加一行,请删除 datetime_gmt 列的默认值并重试。

注意:您的代码存在语法错误。

改变这个:

$load_query = "INSERT IGNORE INTO new (datetime_gmt,field2,field3)
    VALUES ('".$row[0]"','".$y."','".$z."');";

到这里:

$load_query = "INSERT IGNORE INTO new (datetime_gmt,field2,field3)
    VALUES ('".$row[0]."','".$y."','".$z."');";

如果上述方法不起作用,请尝试在您的 SQL 模式中仅使用引擎替换:

set @@sql_mode='no_engine_substitution';

然后通过运行以下命令确保它显示 NO_ENGINE_SUBSTITUTION:

select @@sql_mode;

然后尝试再次运行您的代码。设置@@sql_mode 可能不是服务器范围的,它可能只适用于您当前的会话。

【讨论】:

  • 您好,感谢您的帮助,但它确实添加了一行。它甚至在“8”前面添加了一个“0”。
  • datetime_gmt 列默认为 0000-00-00 00:00:00 时是否插入一行?
  • 是的。至于错误,它在代码中是正确的,只是在我在这里输入时不正确。对此感到抱歉。
  • 好的。您是否尝试在没有默认设置为 0000-00-00 00:00:00 的情况下运行 PHP 脚本,就像我在回答中提到的那样?请试一试。
  • 您运行的是 MySQL 5.7 吗?如果没有,你运行的是什么版本?我能想到的另一个问题是您的代码强制将空白插入到数据库中。因此,例如,如果您的文件有一个空白日期,则可能会导致您遇到错误。请检查您的纯文本文件。
猜你喜欢
  • 2021-08-28
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 2013-10-14
相关资源
最近更新 更多