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
答案 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值的错误来源是另一天。