#1265 - 列MYSQL 5.7的数据被截断

时间:2016-09-06 14:31:42

标签: mysql

我将服务器升级到PHP7和MySQL 5.7后,我的查询出错:

UPDATE user SET user_rank_points = (@i := (@i + 1))

错误是:#1265 - 第1行的'user_rank_points'列数据被截断

有没有人有解决方案?

3 个答案:

答案 0 :(得分:0)

随着人们升级到MySQL 5.7,这些问题将会出现。这个版本的MySQL使严格的SQL模式成为默认模式,不像早期的版本可以选择严格模式。

如果没有严格模式,当您尝试将类似32768的值存储到SMALLINT时,它会静默将值截断为32767,这是您可以存储在签名16中的最大值位整数。

您是否更喜欢MySQL更改您尝试存储的数据?如果是这样,您可以更改sql_mode以删除严格模式,超过2 15 -1的所有值都将被截断为该值。请在此处阅读有关如何执行此操作的信息:http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html

或者你更喜欢它存储更大的整数值?如果是,请将列更改为INT

或者当你的@i超过2 15 -1时,你是否更喜欢它会引发错误?如果是这样,这就是它现在的行为。

重新评论:

首先,INT(11)INT(2)INT(327)没有任何区别。 number参数只是显示宽度的提示,它与INT将存储的位数无关。请参阅我对Types in MySQL: BigInt(20) vs Int(20)

的回答

您说在将列类型更改为INT后仍然会出现相同的错误。 @i的价值是多少?收到错误后运行此查询:

SELECT @i;

答案 1 :(得分:0)

我认为问题是@i未在此代码中初始化:

if(!$db->query('SET @i:=0')) {
    $sdl->log('- Error: Some Error OutputCONTINUE');
}
else {
    $sql = 'UPDATE user
            SET user_rank_points = (@i := (@i + 1))
            WHERE user_active=1 ORDER BY user_points DESC';

    if(!$db->query($sql)) {
        $sdl->log('- Error: Some Error Output');
    }
}

因为如果我在PHPMYADMIN中的SQL编辑器中输入两行,则代码执行时没有问题

答案 2 :(得分:0)

我找到了使用mysqli_multi_query()而不是mysqli_query()的解决方案

$sql='SET @i;';
$sql.='SET user_rank_points = (@i := (@i + 1))
      WHERE user_active=1 ORDER BY user_points DESC';

$link = mysqli_connect("localhost", "my_user", "my_password", "world");
mysqli_multi_query($link,$sql);

我不知道这是否是一个安全的解决方案,但它完成了我的工作。