fc2ブログ

(元)社内SEの徒然なる日記

SQL(Oracle)でカタカナを全角に変換!

■ カタカナ変換

諸般の事情で、カタカナを半角から全角に変換する必要が出てきたので、変換方法を調べて見ました。

実は、一昔前に調べたことがあったのですが、その時はストアドプロシージャとかを使ってガリガリと作りこむしか無かったはず。それはやりたくなかったので、何か新しい方法が出ていないかと思ったのです。

って事で、軽く調べて見たのですが、あっさりと希望するモノが見つかりました。
何でも、UTL_I18NパッケージのTRANSLITERATEファンクションってものを使えば良いそうです。

Oracle10gからの機能らしいのですが、私が使用しているOracleは11gなので、問題なく使えそうです。

■ utl_i18n.transliterate

マニュアルによると、このtransliterateってのは、変換する文字と、変換方法を指定して使うようです。

さっそく、半角カタカナから全角カタカナへの変換を実験してみました。
SELECT 
'アイウエオ' AS 半角カタカナ,
utl_i18n.transliterate('アイウエオ', 'hwkatakana_fwkatakana') AS 全角カタカタ
FROM DUAL


結果、きちんと全角変換してくれました。

■ 変換方法

今回はカタカナの半角→全角の変換を行いましたが、他にも変換できるようです。

① 'kana_fwkatakana'
 ひらがな・カタカナ → 全角カタカナ

② 'kana_hwkatakana'
 ひらがな・カタカナ → 半角カタカナ

③ 'kana_hiragana'
 ひらがな・カタカナ → ひらがな

④ 'fwkatakana_hwkatakana'
 全角カタカナ → 半角カタカナ

⑤ 'fwkatakana_hiragana'
 全角カタカナ → ひらがな

⑥ 'hwkatakana_fwkatakana'
 半角カタカナ → 全角カタカナ

⑦ 'hwkatakana_hiragana'
 半角カタカナ → ひらがな

⑧ 'hiragana_fwkatakana'
 ひらがな → 全角カタカナ

⑨ 'hiragana_hwkatakana'
 ひらがな → 半角カタカナ

面白そうなので、一通り試してみました。
ひらがなの「あ」、全角カタカナの「イ」、半角カタカナの「ウ」の3文字を使って、全てのパターンで変換しました。

SELECT 
utl_i18n.transliterate('あイウ', 'kana_fwkatakana') AS ①後,
utl_i18n.transliterate('あイウ', 'kana_hwkatakana') AS ②後,
utl_i18n.transliterate('あイウ', 'kana_hiragana') AS ③後,
utl_i18n.transliterate('あイウ', 'fwkatakana_hwkatakana') AS ④後,
utl_i18n.transliterate('あイウ', 'fwkatakana_hiragana') AS ⑤後,
utl_i18n.transliterate('あイウ', 'hwkatakana_fwkatakana') AS ⑥後,
utl_i18n.transliterate('あイウ', 'hwkatakana_hiragana') AS ⑦後,
utl_i18n.transliterate('あイウ', 'hiragana_fwkatakana') AS ⑧後,
utl_i18n.transliterate('あイウ', 'hiragana_hwkatakana') AS ⑨後
FROM DUAL


変換結果はこちらです。
Oracleカタカナ変換1

なかなかいい感じですね。

■ 意地悪テスト

実際に変換したい項目に、変換対象じゃない文字があった場合の動作も試してみました。
つまり、英数字や記号ですね。これらについては変換されないはずですが...

いろいろと実験してみました。
-- まずは、半角の記号と数値
SELECT
utl_i18n.transliterate('!"#$%&()=~|{}@`+*;:][<>?/,.\_*-', 'kana_fwkatakana') AS ①後,
utl_i18n.transliterate('!"#$%&()=~|{}@`+*;:][<>?/,.\_*-', 'kana_hwkatakana') AS ②後,
utl_i18n.transliterate('!"#$%&()=~|{}@`+*;:][<>?/,.\_*-', 'kana_hiragana') AS ③後,
utl_i18n.transliterate('!"#$%&()=~|{}@`+*;:][<>?/,.\_*-', 'fwkatakana_hwkatakana') AS ④後,
utl_i18n.transliterate('!"#$%&()=~|{}@`+*;:][<>?/,.\_*-', 'fwkatakana_hiragana') AS ⑤後,
utl_i18n.transliterate('!"#$%&()=~|{}@`+*;:][<>?/,.\_*-', 'hwkatakana_fwkatakana') AS ⑥後,
utl_i18n.transliterate('!"#$%&()=~|{}@`+*;:][<>?/,.\_*-', 'hwkatakana_hiragana') AS ⑦後,
utl_i18n.transliterate('!"#$%&()=~|{}@`+*;:][<>?/,.\_*-', 'hiragana_fwkatakana') AS ⑧後,
utl_i18n.transliterate('!"#$%&()=~|{}@`+*;:][<>?/,.\_*-', 'hiragana_hwkatakana') AS ⑨後
FROM DUAL

-- 全角の記号と数値
SELECT
utl_i18n.transliterate('!”#$%&()= ̄|{}@`+*;:][<>?/,.¥_*-1234567890', 'kana_fwkatakana') AS ①後,
utl_i18n.transliterate('!”#$%&()= ̄|{}@`+*;:][<>?/,.¥_*-1234567890', 'kana_hwkatakana') AS ②後,
utl_i18n.transliterate('!”#$%&()= ̄|{}@`+*;:][<>?/,.¥_*-1234567890', 'kana_hiragana') AS ③後,
utl_i18n.transliterate('!”#$%&()= ̄|{}@`+*;:][<>?/,.¥_*-1234567890', 'fwkatakana_hwkatakana') AS ④後,
utl_i18n.transliterate('!”#$%&()= ̄|{}@`+*;:][<>?/,.¥_*-1234567890', 'fwkatakana_hiragana') AS ⑤後,
utl_i18n.transliterate('!”#$%&()= ̄|{}@`+*;:][<>?/,.¥_*-1234567890', 'hwkatakana_fwkatakana') AS ⑥後,
utl_i18n.transliterate('!”#$%&()= ̄|{}@`+*;:][<>?/,.¥_*-1234567890', 'hwkatakana_hiragana') AS ⑦後,
utl_i18n.transliterate('!”#$%&()= ̄|{}@`+*;:][<>?/,.¥_*-1234567890', 'hiragana_fwkatakana') AS ⑧後,
utl_i18n.transliterate('!”#$%&()= ̄|{}@`+*;:][<>?/,.¥_*-1234567890', 'hiragana_hwkatakana') AS ⑨後
FROM DUAL

-- 半角の英字
SELECT
utl_i18n.transliterate('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'kana_fwkatakana') AS ①後,
utl_i18n.transliterate('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'kana_hwkatakana') AS ②後,
utl_i18n.transliterate('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'kana_hiragana') AS ③後,
utl_i18n.transliterate('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'fwkatakana_hwkatakana') AS ④後,
utl_i18n.transliterate('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'fwkatakana_hiragana') AS ⑤後,
utl_i18n.transliterate('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'hwkatakana_fwkatakana') AS ⑥後,
utl_i18n.transliterate('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'hwkatakana_hiragana') AS ⑦後,
utl_i18n.transliterate('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'hiragana_fwkatakana') AS ⑧後,
utl_i18n.transliterate('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'hiragana_hwkatakana') AS ⑨後
FROM DUAL

-- 全角の英字SELECT
utl_i18n.transliterate('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'kana_fwkatakana') AS ①後,
utl_i18n.transliterate('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'kana_hwkatakana') AS ②後,
utl_i18n.transliterate('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'kana_hiragana') AS ③後,
utl_i18n.transliterate('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'fwkatakana_hwkatakana') AS ④後,
utl_i18n.transliterate('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'fwkatakana_hiragana') AS ⑤後,
utl_i18n.transliterate('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'hwkatakana_fwkatakana') AS ⑥後,
utl_i18n.transliterate('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'hwkatakana_hiragana') AS ⑦後,
utl_i18n.transliterate('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'hiragana_fwkatakana') AS ⑧後,
utl_i18n.transliterate('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'hiragana_hwkatakana') AS ⑨後
FROM DUAL


上で4つのパターンを実行したところ、全てのパターンで変換されずに元の値が出力されました。記号のテストパターンが足りないですが、まぁ大丈夫でしょう。

...って思っていたのですが、スペースと長音符が妙な変換をされます。

■ 妙な変換のテスト

変換する文字に、'S ー ーE'(S、半角スペース、半角長音符、全角スペース、全角長音符、E)と指定して実行します。
空白があって分りにくいので、文字の始端にSを、終端にEを入れています。

SELECT 
utl_i18n.transliterate('S ー ーE', 'kana_fwkatakana') AS ①後,
utl_i18n.transliterate('S ー ーE', 'kana_hwkatakana') AS ②後,
utl_i18n.transliterate('S ー ーE', 'kana_hiragana') AS ③後,
utl_i18n.transliterate('S ー ーE', 'fwkatakana_hwkatakana') AS ④後,
utl_i18n.transliterate('S ー ーE', 'fwkatakana_hiragana') AS ⑤後,
utl_i18n.transliterate('S ー ーE', 'hwkatakana_fwkatakana') AS ⑥後,
utl_i18n.transliterate('S ー ーE', 'hwkatakana_hiragana') AS ⑦後,
utl_i18n.transliterate('S ー ーE', 'hiragana_fwkatakana') AS ⑧後,
utl_i18n.transliterate('S ー ーE', 'hiragana_hwkatakana') AS ⑨後
FROM DUAL


結果は、こうなりました。
Oracleカタカナ変換2

長音符と半角スペースはカタカナとして、全角スペースは全角カタカナとひらがなの両方の属性を持つってことでしょうか?

なーんか、嫌ですねぇ。

■ 結果

ところで、長音符て半角も存在したんですね。今回の実験で全角の長音符を突っ込んだら、小さな長音符が出てきてビックリしました。

それにしても、スペースと長音符の件、もしかしてバグなのかなぁ?
まぁ、ちょっと問題もあるようですが、概ね問題はなさそうなので、使う事にしました。

--- blog end —

スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する