MySQLのUDF(ユーザ定義関数)機能を使い、アルファベットの文字列をひらがな順にソートするオリジナル関数を作成してみた。このUDF関数はアルファベットの文字列データが含まれるMySQLのデータカラムに対して、日本語固有のひらがな順にソートを可能にする。漢字、ひらがなで登録された2byte文字列データであれば、MySQL自身が内部で持っている辞書データによりひらがなソートが可能なのだが、アルファベットの文字列データをソートしようとした場合は英語固有のアルファベット順ソートになってしまう。そこで今回作成した関数(alpha_to_hiragana関数と命名)内部において、アルファベットの文字列に対して、ひらがな順にソートできるように、ひらがな順にデータの重みづけの内部変換を行い、ひらがなソートを実現した。alpha_to_hiragana関数の開発ポイントを今回記述してみたいと思う。
そもそものUDF関数の実装方法を知りたい方は、下記の関連リンク先サイトがわかりやすいのでそちらを見てほしい
アルファベット順ソートとひらがな順ソートの違い
まずは、通常のソート(アルファベット順)とalpha_to_hiragana関数(ひらがな順)を 使ったソートの処理結果の違いを見てもらいたい
無秩序にならんだサンプルデータ(テーブル名:actor)
+-------------------+ | name | +-------------------+ | Saitou akira |(さ行)(頭文字:S) | L7ucky Isono |(ら行)(頭文字:L) | aida masao |(あ行)(頭文字:A) | YamadaShougo |(や行)(頭文字:Y) | AKAGI haruka |(あ行)(頭文字:A) | Mike Davis |(ま行)(頭文字:M) | Tanaka123 |(た行)(頭文字:T) | hamadamayui |(は行)(頭文字:H) | goto satoru |(か行)(頭文字:G) | WANIDA KENJI |(わ行)(頭文字:W) | N-A-G-U-R-A-R-Y-O |(な行)(頭文字:N) +-------------------+
アルファベットソート後(A->B->C->D->E...順に並びかえられた)
使用したクエリ:SELECT name FROM actor ORDER BY name ASC
+-------------------+ | name | +-------------------+ | aida masao |(頭文字:A) | AKAGI haruka |(頭文字:A) | goto satoru |(頭文字:G) | hamadamayui |(頭文字:H) | L7ucky Isono |(頭文字:L) | Mike Davis |(頭文字:M) | N-A-G-U-R-A-R-Y-O |(頭文字:N) | Saitou akira |(頭文字:S) | Tanaka123 |(頭文字:T) | WANIDA KENJI |(頭文字:W) | YamadaShougo |(頭文字:Y) +-------------------+
ひらがなソート後(あ->か->さ->た->な...順に並びかえられた)
使用したクエリ:SELECT name FROM actor ORDER BY alpha_to_hiragana(name) ASC
+-------------------+ | name | +-------------------+ | aida masao |(あ行) | AKAGI haruka |(あ行) | goto satoru |(か行) | Saitou akira |(さ行) | Tanaka123 |(た行) | N-A-G-U-R-A-R-Y-O |(な行) | hamadamayui |(は行) | Mike Davis |(ま行) | YamadaShougo |(や行) | L7ucky Isono |(ら行) | WANIDA KENJI |(わ行) +-------------------+
アルファベット文字列をひらがな順への重みづけ方法
YamadaTarou(やまだたろう)、TanakaMasao(たなかまさお)をサンプルデータとして説明する
文字列を小文字に変換する
ローマ字読みから重みづけるための変換テーブルを作成する
変換テーブルを用いて、サンプルデータを変換する
変換後のアルファベット文字列で比較を行う
YamadaTarou => yamadatarou TanakaMasao => tanakamasao
以下が変換テーブルである、母音のあ行は1文字全てにアルファベットを割り当て、 子音はまとめて1文字のアルファベットを割りあてる
あ行:あ(a)、い(b)、 う(c)、 え(d)、 お(e) か行:(f) さ行:(g) た行:(h) な行:(i) は行:(j) ま行:(k) や行:(l) ら行:(m) わ行:(n)
y a m a d a t a r o u ↓ l a k a h a h a m e c t a n a k a m a s a o ↓ h a i a f a k a g a e
y a m a d a t a r o u
[昇順] h a i a f a k a g a e <<< l a k a h a h a m e c [降順]
(TanakaMasao) (YamadaTarou)
(たなかまさお) (やまだたろう)
このようにアルファベット文字列であっても、ひらがな順にソートを実現できるようになる。実際のソートに関しては、alpha_to_hiragana関数内で実装するのではなく、MySQLのORDER BY句で利用してひらがなソートを実現している。
興味をもたれた方は
SOURCEFORGE.JPのMySQLibプロジェクト内にUPしているので 下記よりアクセスしていただけると幸いである
mysqlに独自関数を組み込む(UDF)
Trackback URL
http://blog.fukaoi.org/2009/06/14/mysql_udf_alpha_to_hiragana?tb=y&entry_id=17
XML