IPアドレスを含むデータをログテーブルに挿入しています。何らかの理由で、IP列がNULLになることがあります。ほとんどの場合(すべてのレコードの99.9%)、IPは適切に記録されます。
IPは、inet_aton()関数を使用して、符号なしINT列に格納されます。これにより、IPアドレスがドットで区切られた形式(zzz.xxx.yyy.www)から数値形式に変換されます。
MySQLのドキュメントには、INET_ATON()とNULLに関して次のように記載されています。
INET_ATON()は、引数を理解できない場合、NULLを返します。
INET_ATON()は、短い形式のIPアドレス(「127.0.0.1」の表現としての「127.1」など)に対してNULL以外の結果を返す場合と返さない場合があります。
クエリに流れ込むデータをログに記録しており、バインドされているパラメータに実際には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
私にとって、それは神秘的です。これをさらにデバッグする方法について何か提案はありますか?