我将数据插入到日志表中,包括 IP 地址。出于某种原因,IP 列有时是 NULL'ed。在大多数情况下(占所有记录的 99.9%),IP 被正确记录。
IP 使用 inet_aton() 函数存储在无符号 INT 列中。这会将 IP 地址从它的书面点分隔形式 (zzz.xxx.yyy.www) 转换为其数字形式。
MySQL 文档说明了有关 INET_ATON() 和 NULL 的以下内容:
如果 INET_ATON() 不理解其参数,则返回 NULL。
INET_ATON() 可能会或可能不会返回短格式 IP 地址的非 NULL 结果(例如 '127.1' 作为 '127.0.0.1' 的表示)。
我一直在记录流入查询的数据,并验证了被绑定的参数确实包含 IP 地址而不是空值。他们的 IP 地址看起来不错,如果我手动运行
选择 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
对我来说,这很神秘。关于如何进行进一步调试的任何建议,有人吗?