1

inet_ptonPHPを4バイト文字列として使用して、IPアドレスを文字列として保存しています。inet_ntoamysql を使用して人間が読める表現を作成するには、 MySQLを使用したいのですが、整数値のみを受け入れるようです。

!"#では、 ( ip32.33.34.35に対応し、スペースにも注意してください) のような文字列を整数 (539042339この例では に対応) として読み取るにはどうすればよいでしょうか?

4

2 に答える 2

1

SUBSTR()MySQL < 5.6.3 では、との組み合わせでこれを行うことができますORD()

SELECT INET_NTOA(
    ORD(SUBSTR(' !"#', 1, 1)) * 16777216 +
    ORD(SUBSTR(' !"#', 2, 1)) * 65536 +
    ORD(SUBSTR(' !"#', 3, 1)) * 256 +
    ORD(SUBSTR(' !"#', 4, 1)))

結果は次のとおりです。

32.33.34.35

また、実際にはすでにそこにいるので、次のようにして自分で文字列を作成することもできますCONCAT():

SELECT CONCAT(
    ORD(SUBSTR(' !"#', 1, 1)), '.',
    ORD(SUBSTR(' !"#', 2, 1)), '.',
    ORD(SUBSTR(' !"#', 3, 1)), '.',
    ORD(SUBSTR(' !"#', 4, 1)))

末尾のスペースが失われないように、MySQL 5 以降またはバイナリ列で (CHAR ではなく) VARCHAR を使用していることを願っています。

IPv6 をサポートするには、最初にIFステートメントで長さを確認し、少し異なる方法で連結する必要があります。

MySQL 5.6.3 では、新しいINET6_NTOA()関数がこれを直接サポートしています。バイナリ文字列を受け取り、IPv4 と IPv6 の両方をサポートします。

SELECT INET6_NTOA(' !"#')
于 2012-07-12T19:03:47.413 に答える