アドレスが文字列として保存される場合の解決策があります。したがって、アルゴリズムのその部分を作成したい場合は、ここで私のソリューションを使用できます。
特にIPv6の場合は、少し注意が必要です。IPv6では、オプションで、1:0:0:0:0:0:0:1と同等の1:: 1のような圧縮セグメントを使用できます。これが、注意が必要な主な理由です。
IPAddress Javaライブラリは、指定されたサブネット内のアドレスを検索するためのmysqlSQLを生成します。リンクはこの問題をより詳細に説明しています。免責事項:私はプロジェクトマネージャーです。
基本的なアルゴリズムは、サブネットアドレスのネットワークセクションを取得し、次にそのセクションの各バリアントを取得し(たとえば、上記の2つの文字列は完全なアドレス1 :: 1のバリアントです)、セグメントセパレータの数をカウントしてから実行します。一致するアドレスのmysqlサブ文字列だけでなく、一致するアドレスの区切り文字の総数もカウントします。
サンプルコードは次のとおりです。
public static void main(String[] args) throws IPAddressStringException {
System.out.println(getSearchSQL("columnX", "1.2.3.4/16"));
System.out.println(getSearchSQL("columnX", "1:2:3:4:5:6:7:8/64"));
System.out.println(getSearchSQL("columnX", "1::8/64"));
}
static String getSearchSQL(String expression, String ipAddressStr) throws IPAddressStringException {
IPAddressString ipAddressString = new IPAddressString(ipAddressStr);
IPAddress ipAddress = ipAddressString.toAddress();
IPAddressSection networkPrefix = ipAddress.getNetworkSection(ipAddress.getNetworkPrefixLength(), false);
StringBuilder sql = new StringBuilder("Select rows from table where ");
networkPrefix.getStartsWithSQLClause(sql, expression);
return sql.toString();
}
Ouptut:
Select rows from table where (substring_index(columnX,'.',2) = '1.2')
Select rows from table where (substring_index(columnX,':',4) = '1:2:3:4')
Select rows from table where ((substring_index(columnX,':',4) = '1:0:0:0') OR ((substring_index(columnX,':',2) = '1:') AND (LENGTH (columnX) - LENGTH(REPLACE(columnX, ':', '')) <= 5)))