プチIT化 PR

【Oracle】TO_SINGLE_BYTE関数で半角に変換されない原因

記事内に商品プロモーションを含む場合があります。
当サイトは、アフィリエイト広告を利用しています。

こんにちは、今回はOracleデータベースのTO_SINGLE_BYTE関数という全角を半角に変換するという関数についての記事です。

困ってる
困ってる
TO_SINGLE_BYTE関数を使ってるのに、半角に変換されない!

と私と同じような現象に悩んでいる方の参考になれば幸いです!この記事では、なぜ変換できないのかという理由と代替案を書いています。それでは、いってみましょう。

Oracle:全角半角を変換する関数

まずは事前知識として、半角・全角を変換する関数としては以下表に記載した関数があります。(※厳密には、マルチバイト文字とシングルバイト文字の変換です。これについては後述しています。)

TO_MULTI_BYTE(Str)半角を全角に変換する。Strは文字列。
TO_SINGLE_BYTE(Str)全角を半角に変換する。Strは文字列。

事象:全角カタカナが半角に変換されない

今回私が出会った事象は、全角カタカナを半角カタカナに変換しようと、TO_SINGLE_BYTE関数を使うも、半角カタカナに変換されず全角カタカナのまま出力されてきたというものです。

具体的には、名前のフリガナ(全角カタカナ)を半角カタカナに変換しようとしました。以下のようにSELECT文の中で関数を使いました。

SELECT TO_SINGLE_BYTE(FURI) FROM NAME_LIST

実行結果は、全角カタカナのフリガナがそのまま変換されずに出てきました。関数エラーなども出ていないのになぜなのか、次章からまとめていきます。

TO_SINGLE_BYTEで変換できない原因

変換できない原因は、TO_SINGLE_BYTE関数が簡単に言うと半角・全角カタカナに対応していないことがあるからです。厳密には、シングルバイト文字がないマルチバイト文字は、変換されずにそのまま出力される(関数の戻り値として戻ってくる)ようです。

※ちなみにOracleのドキュメントは以下です。(公式情報を知りたい方はこちらで確認お願いいたします。)

わたあめ
わたあめ
もう少し詳しく見ていきましょう!

シングルバイト・マルチバイト文字とは?

シングルバイト文字は1byteで表される文字のことです。マルチバイトは2byte以上で表される文字のことです。byteはコンピュータで扱われている単位です。ちょっとこれだけでは分からないですよね。

例えば、シングルバイト文字はASCIIコードという文字コード表が有名です。シングルバイト:byte=8bitで表すことが出来る128個の文字を扱っている文字コードです。abcd…の半角英字や1234…の半角数字、!+$などの半角記号がシングルバイト文字として扱われています。

ただ、日本語は平仮名・カタカナ・漢字と文字の種類が多くて1byte=8bitで表すにはちょっとデータ量が足りないということで、2byte以上のマルチバイト文字で表されることが多いです。

厳密にはどの文字コードを使うかによります。

半角カタカナはシングルバイト?マルチバイト?

で、半角カタカナはシングルバイト文字なのか?マルチバイト文字なのか?という疑問が出てきました。半角なのでシングルバイトっぽいイメージがありましたが、どうやらそういう事ではないみたいなんです。

半角カタカナは、UTF-8・EUC-JP・UTF-16という文字コードではマルチバイト文字として扱われていて、SHIFT_JIS・JISという文字コードではシングルバイト文字として扱われているとのこと。

わたあめ
わたあめ
つまりどの文字コードを使っているか?!で半角カタカナがシングルバイト文字なのか、マルチバイト文字で扱われているのかが分かれる!

Oracleで使われている文字コードは?

自分が使っているOracleではどの文字コードを採用しているか、確認する必要があります。半角カタカナがどのシングルバイト文字で扱われているのか、マルチバイト文字で扱われているのかを判断するためにです。

Oracleで文字コードを確認するSQLは以下です。

SELECT * FROM NLS_DATABASE_PARAMETERS;

この実行結果の「NLS_CHARACTERSET」という項目が文字コードのようです。私の環境では以下でした。

NLS_CHARACTERSET | AL32UTF8

AL32UTF8は「UTF-8」という文字コードを指します。ちなみに、Oracleデータベースがどの文字コードを採用しているかによってここは変わります。他には、JA16SJISTILDEは「SHIFT_JIS」を指しています。

で、この結果私の使っているデータベースで採用している文字コードはUTF-8ということで、半角カタカナはマルチバイトで扱われている事が発覚しました。半角カタカナがシングルバイト文字として扱われていないことが分かりました。

TO_SINGLE_BYTE関数はマルチバイト文字をシングルバイト文字に変換する関数なので、そもそもシングルバイト文字として扱われていないので、出来なかったということでした。

結論まとめ

今回Oracleデータベースで使っているUTF-8のコードだと、半角カタカナはマルチバイトで扱われているということが分かりました。マルチバイト文字からシングルバイト文字に変換するTO_SINGLE_BYTE関数を使っても、UTF-8の文字コードでは半角カタカナにシングルバイト文字がないので変換できず全角カタカナがそのまま全角カタカナで出てきてしまったということでした。

半角カタカナがシングルバイト文字として扱われているSHIFT_JISなどの文字コードを扱っているデータベースであれば変換が上手くいくのでしょうか?ここは、未検証です。

対処:Excelで変換

ではどうやって全角カタカナを半角カタカナに変換しようかな~という所ですが、私はExcelを使って変換しようと思います。

Excelの関数で半角へ変換する関数は以下があります。

=ASC(セル)

今回、OracleデータベースでUTF-8の文字コードを採用しているデータで試しましたが、上手くいきました。Oracle→Excelと違うアプリケーションとなるのでひと手間増えてしまいますが、仕方がないですね。うん。

さいごに

最後までお読みいただきありがとうございました!少しでもお役に立てていれば幸いです。

データベース操作に詳しくなりませんか?

SQL 第2版: ゼロからはじめるデータベース操作
SQL 第2版: ゼロからはじめるデータベース操作
ミック 著

Amazon

それでは、また次の記事で!