1

我将数据插入到日志表中,包括 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

对我来说,这很神秘。关于如何进行进一步调试的任何建议,有人吗?

4

1 回答 1

1

您可能在输入中添加了空格(或不可打印字符)。

假设您在此处发布了文字输出:

Array
(
    [email] => user@domain.com
    [groupid] => 51299
    [label_subscribe_ip] =>  145.222.138.151
)

145.在表示真正的输入是_145.222.138.151(开头有一个空格)之前有两个空格。

trim()在将 ip 添加到参数列表之前尝试使用。

于 2012-12-03T11:19:30.493 回答