我将服务器升级到PHP7和MySQL 5.7后,我的查询出错:
UPDATE user SET user_rank_points = (@i := (@i + 1))
错误是:#1265 - 第1行的'user_rank_points'列数据被截断
有没有人有解决方案?
答案 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);
我不知道这是否是一个安全的解决方案,但它完成了我的工作。