我正在将数据插入到日志表中,包括IP地址 . 出于某种原因,IP列有时是NULL . 在大多数情况下(占所有记录的99.9%),IP被正确记录 .
使用inet_aton()函数将IP存储在无符号INT列中 . 这会将IP地址从其以点分隔的形式(zzz.xxx.yyy.www)转换为数字形式 .
MySQL文档说明了有关INET_ATON()和NULL的以下内容:
如果INET_ATON()不理解其参数,则返回NULL . INET_ATON()可能会也可能不会为短格式IP地址返回非NULL结果(例如'127.1'表示'127.0.0.1') .
我一直在记录流入查询的数据,并验证了绑定的参数确实包含IP地址而不是null . 他们的IP地址看起来很好,如果我手动运行一个
SELECT INET_ATON('zzz.yyy.xxx.www');
结果是数字表示,如预期的那样 .
为了完整性,代码(注意:删除看似无关的列):
/* @var $conn PDO */
$stmt = $conn->prepare(
'INSERT INTO subscription_log(
email, groupid, subscribe_ip
) VALUES (
:email,
:groupid,
inet_aton(:label_subscribe_ip),
)');
$result = $stmt->execute($params);
// With the following input for $params (print_r):
Array
(
[email] => user@domain.com
[groupid] => 51299
[label_subscribe_ip] => 145.222.138.151
)
最后,虽然我怀疑它是否相关,MySQL版本信息:
version = 5.5.27-28.1
version_comment = Percona Server (GPL), Release 28.1
version_compile_machine = x86_64
version_compile_os = Linux
对我来说,这很神秘 . 有关如何进一步调试这个的任何建议,任何人?
1 回答
您可能在输入中添加了空格(或不可打印的字符) .
假设您在此处发布了文字输出:
在
145.
之前有两个空格,意味着真正的输入是_145.222.138.151
(开头有空格) .在将ip添加到参数列表之前尝试使用trim() .