数据因 PHP 和 mySQL 列错误而被截断?
Data truncuated for a column error with PHP and mySQL?
我在 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;
该列的类型为 'datetime',默认值为“0000-00-00 00:00:00”,它是 table 的 PRI。如果您想知道 "x" 变量,它用于跳过前两行。
编辑 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
这里是 table "new" 的描述:
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 作为列的大小。
请运行将此查询直接插入您的数据库: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 集可能不是服务器范围的,它可能只适用于您当前的会话。
我在 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;
该列的类型为 'datetime',默认值为“0000-00-00 00:00:00”,它是 table 的 PRI。如果您想知道 "x" 变量,它用于跳过前两行。
编辑 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
这里是 table "new" 的描述:
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 作为列的大小。
请运行将此查询直接插入您的数据库: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 集可能不是服务器范围的,它可能只适用于您当前的会话。