MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでvarcharカラムのIPアドレスを整数に変換・コピーする方法【INET_ATON()】

INET_ATON()関数とは

varchar型のカラムに保存されたIPアドレスを、同じテーブル内で整数値に変換したい場合は、MySQLのINET_ATON()関数を使用します。この関数は、ドット区切り(例:「192.168.120.0」)のIPアドレス文字列を32ビットの数値に変換します。IPアドレスを整数として扱うことで、保存サイズの節約や、範囲条件での検索効率の向上といったメリットが得られます。

ステップ1:サンプルテーブルの作成

まず、IPアドレスをvarchar型で保存するテーブルを作成しましょう。

mysql> create table DemoTable1404
    -> (
    -> IpAddress varchar(40)
    -> );
Query OK, 0 rows affected (1.02 sec)

ステップ2:レコードの挿入

INSERT文でテーブルにいくつかのIPアドレスを登録します。

mysql> insert into DemoTable1404 values('192.168.120.0');
Query OK, 1 row affected (0.43 sec)
mysql> insert into DemoTable1404 values('192.168.120.20');
Query OK, 1 row affected (0.60 sec)
mysql> insert into DemoTable1404 values('224.0.0.0');
Query OK, 1 row affected (0.42 sec)

ステップ3:登録内容の確認

SELECT文ですべてのレコードを表示して確認します。

mysql> select * from DemoTable1404;

次のような出力が得られます。

+----------------+
| IpAddress      |
+----------------+
| 192.168.120.0  |
| 192.168.120.20 |
| 224.0.0.0      |
+----------------+
3 rows in set (0.00 sec)

varcharから整数へIPアドレスを変換するクエリ

varcharカラムのIPアドレスを整数に変換するには、SELECT文でINET_ATON()関数を呼び出すだけです。

mysql> select inet_aton(IpAddress) from DemoTable1404;

実行結果は以下のとおりです。

+----------------------+
| inet_aton(IpAddress) |
+----------------------+
|           3232266240 |
|           3232266260 |
|           3758096384 |
+----------------------+
3 rows in set (0.00 sec)

それぞれ「192.168.120.0 → 3232266240」「192.168.120.20 → 3232266260」「224.0.0.0 → 3758096384」という整数値に変換されていることがわかります。

INET_NTOA()で変換結果を検証する

正しく変換できたかどうかを確認するには、逆変換を行うINET_NTOA()関数を使います。この関数は、整数値を元のドット区切りのIPアドレス形式に復元できます。

mysql> select inet_ntoa('3232266240');

実行結果:

+-------------------------+
| inet_ntoa('3232266240') |
+-------------------------+
| 192.168.120.0           |
+-------------------------+
1 row in set (0.27 sec)

「3232266240」が元の「192.168.120.0」に復元されたため、変換が正しく行われたことが証明されました。

補足:テーブルのデータを実際に整数として更新する方法

ここまでの例ではSELECT文で変換結果を表示しただけですが、実際にテーブル内のデータを整数としてコピーしたい場合は、まず整数用のカラムを追加し、その後UPDATE文でINET_ATON()の結果を書き込みます。

mysql> ALTER TABLE DemoTable1404 ADD COLUMN IpAddressInt INT UNSIGNED;
mysql> UPDATE DemoTable1404 SET IpAddressInt = INET_ATON(IpAddress);

IPv4アドレスの最大値「255.255.255.255」は「4294967295」に相当するため、格納先のカラムにはUNSIGNED INT型(符号なし整数)を使用するのが安全です。通常のINT型では最大値が2147483647のため、一部のIPアドレスが収まらない点に注意してください。

  1. MySQLでVARCHAR型のカラムをNULL許容に変更する方法

    MySQLでは、テーブルのカラム定義を後から変更できます。既存のVARCHAR型カラムをNULL値を許容する設定に変更したい場合は、ALTER TABLE文とCHANGE句を組み合わせて使用します。基本構文カラムをNULL許容に変更するには、以下の構文を使用します。ALTER TABLE テーブル名 CHANGE 変更前カラム名 変更後カラム名 データ型 NULL DEFAULT NULL;ポイントは、CHANGE句の後に「現在のカラム名」と「新しいカラム名」の両方を指定する必要がある点です。カラム名を変えない場合でも、同じ名前を2回記述します。また、データ型も改めて指定する必要があります。実

  2. MySQLでテーブルの重複を除いたレコードから平均値を取得するクエリの書き方

    MySQLで平均値を求めるには AVG() 関数を使用します。さらに DISTINCT と組み合わせることで、重複しているレコードを除外した状態で平均を計算することができます。この記事では、実際にサンプルテーブルを作成しながら、個別(ユニーク)なレコードから平均値を取得する方法を解説します。サンプルテーブルの作成まず、以下のクエリでテーブルを作成します。mysql> create table DemoTable1934 ( StudentName varchar(20), StudentMarks int ); Query OK, 0 rows affec