全角文字列を半角にする、半角文字列を全角にする
正確にはシングルバイト文字列とマルチバイト文字列の変換。
- TO_MULTI_BYTE ( string )
- TO_SINGLE_BYTE ( string )
return [ char | varchar2 | nchar | nvarchar2 ]
string | マルチバイト(全角)、または、シングルバイト(半角)に変換する文字列 |
TO_MULTI_BYTE 関数の内容
文字列 string に含まれるシングルバイト文字列をマルチバイト文字に変換する。半角カタカナ、全角カタカナの変換と AL16UTF16 などのマルチバイトのアスキーコードも変換されない。
TO_SINGLE_BYTE 関数の内容
文字列 string に含まれるマルチバイト文字列をシングルバイト文字に変換する。
TO_MULTI_BYTE 関数と同様に 半角カタカナ、全角カタカナの変換と AL16UTF16 などのマルチバイトのアスキーコードも変換されない。
使用できるデータ型
使用できる型は CHAR、VARCHAR2、NCHAR または NVARCHAR2。 CLOB は 暗黙変換可能な文字列長まで。
半角文字とシングルバイト文字の違い
半角文字列は表示や印刷上のサイズをゆえんとするものであり、半角文字とシングルバイト文字列は一致しない。典型的なものが半角カタカナである。
(たとえ SJIS の環境であっても)半角カタカナと全角カタカナは TO_MULTI_BYTE および TO_SINGLE_BYTE で変換できない。
シングルバイト文字は一般的にアスキーコード(キャラクタセット:US7ASCII)に含まれている文字と考えればよいだろう。
必ず アスキーコード=シングルバイト文字というわけでもない
アスキーコード表に載っているアルファベット、記号や数字でもマルチバイト文字の場合があり得る。それは AL16UTF16 を使用した場合などである。
AL16UTF16 は UTF-16 でエンコードされた UNICODE であり 'A' は 2バイトにエンコードされるため半角カナと同様にマルチバイト文字として扱われる。AL32UTF8 / UTF8 はアスキーコード表にある文字はそのまま変わらずに1バイトにエンコードされる。⇒ マルチバイト・キャラクタセット
TO_MULTI_BYTE 使用例
データベースキャラクタセットが JA16SJISTILDE の場合
SQL> select str, to_multi_byte(str) from to_multi_byte_sample;
STR TO_MULTI_BYTE(STR)
-------------------- --------------------
abc abc
1,234.56 1,234.56
ハンカクカタカナ ハンカクカタカナ
+-*/ +−*/
ゼンカクカタカナ ゼンカクカタカナ
各国語キャラクタセットが AL16UTF16 の場合
カラム名 str は VARCHAR2(SJIS)、 カラム名 nstr は NVARCHAR2(AL16UTF16)
SQL> select str, nstr, TO_MULTI_BYTE(str), TO_MULTI_BYTE(nstr)
2 from to_multi_byte_sample;
STR NSTR TO_MULTI_BYTE(STR) TO_MULTI_BYTE(NSTR)
-------------------- -------------------- -------------------- --------------------
abc abc abc abc
1,234.56 1,234.56 1,234.56 1,234.56
+-*/ +-*/ +−*/ +-*/
データベースキャラクタセットが JA16SJIS 系や JA16EUC の場合で各国語キャラクタセット AL16UTF16 の文字列を全角に変換したい場合
結果文字列を AL16UTF16 にしたい場合にはさらに TO_NCHAR(〜) のように重ねる
SQL> select nstr, TO_MULTI_BYTE(nstr), TO_MULTI_BYTE(to_char(nstr))
2 from TO_MULTI_BYTE_SAMPLE;
NSTR TO_MULTI_BYTE(NSTR) TO_MULTI_BYTE(TO_CHAR(NSTR))
---------- --------------------- ----------------------------
abc abc abc
1,234.56 1,234.56 1,234.56
+-*/ +-*/ +−*/
TO_SINGLE_BYTE 使用例
TO_SINGLE_BYTE でも TO_MULTI_BYTE と同様に AL16UTF16 のマルチバイトのアスキーコードが望んだように変換されない。
データベースキャラクタセットが AL32UTF8 / 各国語キャラクタセットが AL16UTF16 環境の場合
SQL> select
2 TO_SINGLE_BYTE('xyz') utf8, TO_SINGLE_BYTE(N'xyz') utf16,
3 TO_SINGLE_BYTE(TO_CHAR(N'xyz')) utf16_to_char
4 from dual;
UTF8 UTF16 UTF16_TO_CHAR
------ ------ --------------
xyz xyz xyz
キャラクタセットが JA16SJISTILDE / AL16UTF16 環境の TO_SINGLE_BYTE のサンプル
カラム名 str は VARCHAR2(SJIS)、 カラム名 nstr は NVARCHAR2(AL16UTF16)
SQL> select str, nstr, TO_SINGLE_BYTE(str), TO_SINGLE_BYTE(nstr)
2 from to_single_byte_sample;
STR NSTR TO_SINGLE_BYTE(STR) TO_SINGLE_BYTE(NSTR)
-------------------- -------------------- -------------------- --------------------
xyz xyz xyz xyz
9、876 9、876 9、876 9、876
5,432 5,432 5,432 5,432
アイウ アイウ アイウ アイウ
半角カタカナを全角にする ( ユーザー定義関数 TO_FULL_KANA )
半角カタカナは、TO_SINGLE_BYTE および TO_MULTI_BYTE によって変換することができない。
常にマルチバイト文字扱いと認識されている。
別途ユーザー定義関数を作成する必要がある。
⇒ 半角カタカナを全角に変換する方法
SQL 関数 - TO_MULTI_BYTE,TO_SINGLE_BYTE 関連