更新期间MySQL INET_ATON错误,消息为“字符串值不正确”

时间:2019-03-17 18:38:16

标签: mysql

MySQL是5.7.23。

IFNULL(INET_ATON(''),0)在普通选择中返回0,但在update ... set分配期间返回错误

问:是否有一个补丁可以防止ERROR 1411 (HY000): Incorrect string value:

更新语句是由较大的应用程序生成的,很难修改该应用程序。

mysql> create table foo (id int not null, ip int not null);
Query OK, 0 rows affected (0.21 sec)

mysql> insert into foo values (0,0);
Query OK, 1 row affected (0.26 sec)

更新有效,真实的IP字符串

mysql> update foo set ip = ifnull(inet_aton('10.10.10.254'), 0) where id=0;
Query OK, 1 row affected (0.25 sec)
Rows matched: 1  Changed: 1  Warnings: 0

使用IFNULL的普通选择将获得0

mysql> select IFNULL(inet_aton(''),0);
+-------------------------+
| IFNULL(inet_aton(''),0) |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set, 1 warning (0.00 sec)

使用IFNULL和INET_ATON的空IP字符串更新失败

mysql> update foo set ip = ifnull(inet_aton(''), 0) where id=0;
ERROR 1411 (HY000): Incorrect string value: '''' for function inet_aton

使用IFNULL和INET_ATON的IPv6回送地址更新失败

mysql> update foo set ip = ifnull(inet_aton('::1'), 0) where id=0;
ERROR 1411 (HY000): Incorrect string value: ''::1'' for function inet_aton

2 个答案:

答案 0 :(得分:2)

实际上,在两种情况下,空字符串都是无效的参数。如果您查看警告,则可以看到这是警告:

mysql> warnings;
Show warnings enabled.

mysql> select IFNULL(inet_aton(''),0);
+-------------------------+
| IFNULL(inet_aton(''),0) |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set, 1 warning (0.00 sec)

Warning (Code 1411): Incorrect string value: '''' for function inet_aton

我不确定为什么这只是在使用SELECT时的警告,而在UPDATE中使用同一功能时却是错误。

一种解决方法是使用NULL而不是空白字符串。如果您将NULL作为IP地址字符串传递给INET_ATON(),则返回NULL而不发出警告或错误:

mysql> update foo set ip = ifnull(inet_aton(''), 0) where id=0;
ERROR 1411 (HY000): Incorrect string value: '''' for function inet_aton

mysql> update foo set ip = ifnull(inet_aton(null), 0) where id=0;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

我了解您说很难更改应用程序,但这是我建议的唯一解决方法。

最好的解决方案当然是避免将任何无效的字符串传递给INET_ATON()。

答案 1 :(得分:0)

感谢有识之士条例草案。

结果是,应用程序中只有十几个地方使用INET_ATON,所以我要推送admin,让我将其更改为APP_INET_ATON,这只会调用系统{{1 }},当IP_STRING为“合法”时。

INET_ATON

查明IP_STRING值的错误来源是另一天。