sql >> データベース >  >> RDS >> Mysql

MaxMindのGeoLite2をMySQLにインポートする

    network,geoname_id,registered_country_geoname_id,represented_country_geoname_id,is_anonymous_proxy,is_satellite_provider
    1.0.0.0/24,2077456,2077456,,0,0
    1.0.1.0/24,1814991,1814991,,0,0
    1.0.2.0/23,1814991,1814991,,0,0
    1.0.4.0/22,2077456,2077456,,0,0
    
    create table thing1
    (   network varchar(20) not null,
        geoname_id varchar(20) not null,
        registered_country_geoname_id varchar(20) not null,
        represented_country_geoname_id varchar(20) not null,
        is_anonymous_proxy varchar(20) not null,
        is_satellite_provider varchar(20) not null
    );
    
    LOAD DATA INFILE 'c:\\dev\\ipaddr.txt' 
    INTO TABLE thing1
    FIELDS TERMINATED BY ',' 
    LINES TERMINATED BY '\n'
    IGNORE 1 LINES
    (@v1,@v2,@v3,@v4,@v5,@v6)
    set network=ifnull(@v1,''),
    geoname_id=ifnull(@v2,''),
    registered_country_geoname_id=ifnull(@v3,''),
    represented_country_geoname_id=ifnull(@v4,''),
    is_anonymous_proxy=ifnull(@v5,''),
    is_satellite_provider=ifnull(@v6,'');
    

    上記は私にとってはうまくいきました。

    以下の編集の開始

    以下では、 stijn-de-witt <が指摘した後、この回答を改善しようとしています/ a> コメントで。

    ただし、コメントで参照されているブログのintに入る更新ステートメントにエラーがあることに注意してください。それで、それを整理するまでの当分の間、私は以下に見られるようにvarcharの変更を見つけました。

    編集1 (詳細については、以下の回答のコメントを参照してください):

    Alter the table to get a "from ip to ip range"
    
    alter table thing1 add column from_ip varchar(20), add column to_ip varchar(20);
    -- note that those two are nullable at the moment. You can always change that later
    

    追加されたばかりのvarcharのテーブルを更新します

    update thing1
    set from_ip=  INET_NTOA(INET_ATON( SUBSTRING_INDEX(network, '/', 1)) 
       & 0xffffffff ^ ((0x1 << ( 32 - SUBSTRING_INDEX(network, '/', -1))  ) -1 )),
    to_ip=   INET_NTOA(INET_ATON( SUBSTRING_INDEX(network, '/', 1)) 
       | ((0x100000000 >> SUBSTRING_INDEX(network, '/', -1) ) -1 ))
    select * from thing1;
    

    (上記の更新ステートメントについては、この回答 のBerndBuffenへのクレジット )

    上記の更新ステートメントの結果:

    mysql> select network,from_ip,to_ip from thing1;
    +------------+---------+-----------+
    | network    | from_ip | to_ip     |
    +------------+---------+-----------+
    | 1.0.1.0/24 | 1.0.1.0 | 1.0.1.255 |
    | 1.0.2.0/23 | 1.0.2.0 | 1.0.3.255 |
    | 1.0.4.0/22 | 1.0.4.0 | 1.0.7.255 |
    +------------+---------+-----------+
    

    ここから、MySQLのマニュアルページを確認してください。その他の機能 INET_ATON(expr)の場合 。

    Edit2 stijn-de-witt に感​​謝します もう一度):

    alter table thing1 add column uint_from_ip int unsigned, add column uint_to_ip int unsigned;
    
    UPDATE thing1 SET uint_from_ip = inet_aton(SUBSTRING(network, 1, LOCATE('/', network) - 1)), 
    uint_to_ip = (inet_aton(SUBSTRING(network, 1, LOCATE('/', network) - 1)) + (pow(2, (32-CONVERT(SUBSTRING(network, LOCATE('/', network) + 1), UNSIGNED INT)))-1));
    

    結果:

    select network,from_ip,to_ip,uint_from_ip,uint_to_ip from thing1;
    +------------+---------+-----------+--------------+------------+
    | network    | from_ip | to_ip     | uint_from_ip | uint_to_ip |
    +------------+---------+-----------+--------------+------------+
    | 1.0.1.0/24 | 1.0.1.0 | 1.0.1.255 |     16777472 |   16777727 |
    | 1.0.2.0/23 | 1.0.2.0 | 1.0.3.255 |     16777728 |   16778239 |
    | 1.0.4.0/22 | 1.0.4.0 | 1.0.7.255 |     16778240 |   16779263 |
    +------------+---------+-----------+--------------+------------+
    

    (上記のクレジットは、この S0BEITブログ 言及されたいくつかの修正の後)



    1. このHibernateMySQL接続が読み取り専用であるのはなぜですか?

    2. 新しいRailsプロジェクトでSQLiteからPostgreSQLに変更する

    3. MySQLの左結合:1つのテーブルからすべてを選択しますが、2番目のテーブルの値と条件が一致する場合のみ

    4. MySQL/MariaDB用のAzureデータベースをオンプレミスサーバーに移行する