end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転します

perlで大文字-小文字や全角-半角を無視した検索

以前、書いた「mysqlのcollateを使って大文字-小文字や全角-半角を無視した検索」の続き?です。

http://d.hatena.ne.jp/end0tknr/20100613/1276427626

以前、UCAというアルゴリズムの存在を教えて頂いた際、UCAはmysql or DBに固有のものだと思っていました。ところが、偶然、Unicode::Collate というperl moduleを見かけ、これをきっかけにUCAがunicode.orgで公開されていることも知りました。

http://search.cpan.org/dist/Unicode-Collate/
SYNOPSIS

use Unicode::Collate;
#construct
$Collator = Unicode::Collate->new(%tailoring);
#sort
@sorted = $Collator->sort(@not_sorted);
#compare
$result = $Collator->cmp($a, $b); # returns 1, 0, or -1.

http://www.unicode.org/Public/UCA/latest/allkeys.txt

Unicode::Collateがあれば、perlでも大文字-小文字や全角-半角を無視した検索を実装できると思います。「でも、mysqlに対し、次のようなsqlで問い合わせるのもありかも」とも思ったりもします。

mysql> select '1' = '1' COLLATE utf8_unicode_ci;
+-------------------------------------+
| '1' = '1' COLLATE utf8_unicode_ci  |
+-------------------------------------+
|                                   1 |
+-------------------------------------+
1 row in set (0.03 sec)

mysql> select '1' = 'A' COLLATE utf8_unicode_ci;
+-----------------------------------+
| '1' = 'A' COLLATE utf8_unicode_ci |
+-----------------------------------+
|                                 0 |
+-----------------------------------+
1 row in set (0.00 sec)