【Oracle】全角・半角の変換あれこれ
文字列の変換がしたい時ってありますよね。
全角半角の入り混じったデータを統一させたいとか、
データサイズを圧縮したいとか、
そんな時に使える関数をまとめてみました。ご参考までに。
忙しい人向けまとめ
英数字にはTO_SINGLE_BYTE、TO_MULTI_BYTE
カナにはTRANSLITERATE関数
英数字の変換 TO_SINGLE_BYTE関数とTO_MULTI_BYTE関数
どんな関数?
その名の通り、シングルバイト文字やマルチバイト文字に変換する関数です。
対応するシングル/マルチバイト文字が存在する場合その文字に変換してくれます。
構文
TO_SINGLE_BYTE({変換したい文字列})
TO_MULTI_BYTE({変換したい文字列})
使い方はカンタン。引数に変換したい文字列を渡すだけです。
公式リファレンス:https://docs.oracle.com/cd/E16338_01/server.112/b56299/functions212.htm
実際に使ってみると
まずはTO_SINGLE_BYTE関数から。
コード:
SELECT 'Oracle オラクル 123' AS 変換前文字列,
TO_SINGLE_BYTE('Oracle オラクル 123') AS 変換後文字列
FROM DUAL;
実行結果:
$$
\begin{array}{|c|c|} \hline
\text{変換前文字列} & \text{変換後文字列} \\ \hline
\text{Oracle オラクル 123} & \text{Oracle オラクル 123} \\ \hline
\end{array}
$$
全角アルファベット、全角数字、全角スペースがしっかり半角に変換されていますね。仮名文字が変換されていない点に注意してください。日本語の全角カナと半角カナは対応する対応するシングル/マルチバイト文字扱いではないため、変換には後述するTRANSLITERATE関数を使用してください。
続いてTO_MULTI_BYTE関数。
コード:
SELECT 'Oracle オラクル 123' AS 変換前文字列,
TO_MULTI_BYTE('Oracle オラクル 123') AS 変換後文字列
FROM DUAL;
実行結果:
$$
\begin{array}{|c|c|} \hline
\text{変換前文字列} & \text{変換後文字列} \\ \hline
\text{Oracle オラクル 123} & \text{Oracle オラクル 123} \\ \hline
\end{array}
$$
こちらも半角アルファベット、半角数字、半角スペースがそれぞれ半角に変換されています。仮名の部分は対応していませんね。
カナの変換 TRANSLITERATE関数
どんな関数?
日本語の仮名文字を変換する関数です。
構文
UTL_I18N.TRANSLITERATE ({変換したい文字列}, {変換名文字列})
第一引数には変換したい文字列そのものを渡します。これが指定した形式に変換されて返ってきます。
第二引数には変換名文字列を渡します。文字列をどのように変換するかを指定します。全角半角の変換に使える定数は、例えばこんな感じです。
$$
\begin{array}{|c|c|c|} \hline
\text{定数名} & \text{値} & \text{説明} \\ \hline
\text{FWKATAKANA\_HWKATAKANA} & \text{'fwkatakana\_hwkatakana'} & \text{全角カタカナのみを半角カタカナに変換します。} \\ \hline
\text{HWKATAKANA\_FWKATAKANA} & \text{'hwkatakana\_fwkatakana'} & \text{半角カタカナのみを全角カタカナに変換します。} \\ \hline
\end{array}
$$
他にもひらがなの変換はもちろん、ひらがなからカタカナやカタカナからひらがなの変換も出来るのですが、今回は上記2つに絞ってご紹介します。詳しく知りたい方は公式リファレンスもご参照ください。
実際に使ってみると
先ずは全角カナを半角に変換してみましょう。
コード:
SELECT '魔法少女まどか☆マギカ' AS 元の文字列,
UTL_I18N.TRANSLITERATE('魔法少女まどか☆マギカ', 'fwkatakana_hwkatakana') AS 変換後文字列
FROM DUAL;
実行結果:
$$
\begin{array}{|c|c|} \hline
\text{元の文字列} & \text{変換後文字列} \\ \hline
\text{魔法少女まどか☆マギカ} & \text{魔法少女まどか☆マギカ} \\ \hline
\end{array}
$$
カタカナのみ半角に変換されていますね。
では半角から全角はどうでしょう。
コード:
SELECT 'ドゥワァ!センナナヒャク!' AS 元の文字列,
UTL_I18N.TRANSLITERATE('ドゥワァ!センナナヒャク!', 'hwkatakana_fwkatakana') AS 変換後文字列
FROM DUAL;
実行結果:
$$
\begin{array}{|c|c|} \hline
\text{元の文字列} & \text{変換後文字列} \\ \hline
\text{ドゥワァ!センナナヒャク!} & \text{ドゥワァ!センナナヒャク!} \\ \hline
\end{array}
$$
こちらも半角カナが全角に変換されています。感嘆符「!」は仮名ではないので半角のままである点に注意してください。