首页 文章

MySQL inet_aton()偶尔返回null

提问于
浏览
1

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

  • 1

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

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

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

    145. 之前有两个空格,意味着真正的输入是 _145.222.138.151 (开头有空格) .

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

相关问题