【问题标题】:MySQL inet_aton() returning null sporadicallyMySQL inet_aton() 偶尔返回 null
【发布时间】:2012-12-03 11:13:05
【问题描述】:

我正在向日志表中插入数据,包括 IP 地址。出于某种原因,IP 列有时是 NULL'ed。在大多数情况下(占所有记录的 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 地址而不是空值。他们的 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

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

【问题讨论】:

  • 您是否 100% 确定没有额外的空格或不可打印的字符被添加到输入中?因为你这里有两个空格[label_subscribe_ip] => 145.222.138.151

标签: mysql ip-address percona


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-01-04
    • 2011-06-11
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2015-08-27
    • 2015-02-26
    相关资源
    最近更新 更多