Oracle AL32UTF8でのバイトサイズ見積

このQ&Aのポイント
  • Oracle AL32UTF8のバイトサイズ見積について調査しました。
  • ASCII文字は1バイト、記号文字は2バイト、日本語は3バイトで保存されます。
  • 一般的には第3水準文字や第4水準文字は考慮せず、NLS_LENGTH_SEMANTICSパラメータを使用して文字数ベースにすることが推奨されます。
回答を見る
  • ベストアンサー

Oracle AL32UTF8でのバイトサイズ見積

データベースのテーブルのカラムのサイズを定義しようとしています。調べた限りでは、Oracle AL32UTF8においては、以下の容量を消費するとなっていました。 (1) ASCII -> 1 byte (2) 記号文字 -> 2 byte (3) 半角カナ、全角カナ、ひらがな、漢字 -> 3 byte これは、「1」や「a」などの英数字は1バイト、「%」や「#」などの記号は2バイト、「あ」「ア」「亜」などの全ての日本語は3バイトで保存されるということだと思いますが正しいでしょうか? そうであれば、例えば氏名項目に20文字を保証したい場合は、一番バイト消費の多い3バイトで見積もり、20 * 3 = 60バイトで定義すればよいでしょうか? 第3水準文字、第4水準文字は4バイトで保存されるという記事もあったのですが、これらはとても稀なケースなので考慮せずに3バイトで考えておくのが一般的でしょうか? あとは、バイトで考えずにNLS_LENGTH_SEMANTICSという初期化パラメータをCharにすることで文字数ベースにすることができるとも聞いたのですがこのアプローチは推奨されますか?全てのテーブルに影響があると思うので、大きな決断になると思うのですが普及したやり方なのでしょうか? 以上、見解を教えて頂けると助かります。以上、宜しくお願いします。

  • Oracle
  • 回答数2
  • ありがとう数15

質問者が選んだベストアンサー

  • ベストアンサー
  • entree
  • ベストアンサー率55% (405/735)
回答No.2

> これは、「1」や「a」などの英数字は1バイト、「%」や「#」などの記号は2バ > イト、「あ」「ア」「亜」などの全ての日本語は3バイトで保存されるという > ことだと思いますが正しいでしょうか? その認識でOKです。 > そうであれば、例えば氏名項目に20文字を保証したい場合は、一番バイト消 > 費の多い3バイトで見積もり、20 * 3 = 60バイトで定義すればよいでしょうか? > 第3水準文字、第4水準文字は4バイトで保存されるという記事もあったのですが、 > これらはとても稀なケースなので考慮せずに3バイトで考えておくのが一般的で > しょうか? anmochiさんがおっしゃられている通り、UTF-8では1文字の最大が6バイトです。 ただ、私が見てきたいくつかのプロジェクトでは、UTF-8 (AL32UTF8) を使用す る場合、1文字あたり3バイト (すなわち、氏名20文字を保証したい場合、60 バイトで定義) で定義していました。 もし、AP側でも何かしらのチェックをするのであれば、DB側は少し緩めで作成す るのも良いかもしれません。VARCHAR の場合、データが入った分の容量しか必要 としませんので。 > あとは、バイトで考えずにNLS_LENGTH_SEMANTICSという初期化パラメータをChar > にすることで文字数ベースにすることができるとも聞いたのですがこのアプロ > ーチは推奨されますか? 推奨する人がいるとしたら便利そうな機能を売り込みたいOracle社のプリセール スくらいです。実績が少ないパラメータをみだりに設定することで、未曾有のバ グに遭遇するリスクがあるため奨めしません。

rio_grande
質問者

お礼

よくわかりました。有難うございました。

その他の回答 (1)

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

> これは、「1」や「a」などの英数字は1バイト、「%」や「#」などの記号は2バイト、 > 「あ」「ア」「亜」などの全ての日本語は3バイトで保存されるということだと思いますが正しいでしょうか? まぁそう思ってくれて良いだろう。 > そうであれば、例えば氏名項目に20文字を保証したい場合は、 > 一番バイト消費の多い3バイトで見積もり、20 * 3 = 60バイトで定義すればよいでしょうか? 日本語を入れる項目であればあなたも後半で言及している通りにcharで定義すべきだと私は思う。 Oracle以外のDBMSを見てみると、PostgreSQLやMySQL(MariaDB)は基本がOracleで言うところのcharで定義される。つまり、varchar(5)にabcdeでもアイウエオでも入れる事ができる。 U+xxxxxだから~AL32UTF8だとそれは何バイトになるから~などと考えながらシステム設計というのが21世紀のこの世の中すでにナンセンスではなかろうか。と言っても、Unicodeのバリエーションセレクターまで正しく1文字扱いされるかは分からないのであまり過信するのも問題ではある。 以上はあくまでも私個人の意見です。 NCHARがAL16UTF16の時のnvarchar2(20)ではサロゲートペアを正しく表現できるのかというところも含めて、知っておく必要はあると思うけどシステマチックなところはDBMSに任せるのが良いのではないかな。 > 第3水準文字、第4水準文字は4バイトで保存されるという記事もあったのですが、 > これらはとても稀なケースなので考慮せずに3バイトで考えておくのが一般的でしょうか? レアケースではあるが、AL32UTF8ですべての文字を登録できる場合一文字は最大で6バイトになる。また、将来を見据えるとUNICODEはどんどん膨れ上がる事を想定すべきだろう。と言っても2050年くらいまでは6バイトの範囲に収まると思う。 > NLS_LENGTH_SEMANTICS まだこれはやった例は見たことないね。私も初めて知った。Oracleが9iから今までにこれのデフォルト値を変えていないというのは、やはりここは手をつけない方がいいって事なんじゃないだろうか。私はOracleを使う場合はID項目的なものはbyteで、名称項目的なものはcharでと、create table文を見たら分かるという風にしている。

関連するQ&A

  • NLS_LENGTH_SEMANTICS変更の影響

    既にデータベースをOracle 11gR2にて構築していて、初期化パラメータ「NLS_LENGTH_SEMANTICS」をデフォルトのByteベースからCharベースに変更しようとしています。この手順と影響範囲が知りたいです。 (1) 手順 私の理解では単純にSYSユーザにて以下を実行する。データベースの再起動は不要で有効になる。 SQL> ALTER SESSION SET NLS_LENGTH_SEMANTICS='CHAR'; 正しいでしょうか? (2) 影響範囲 SID上に構築しているすべてのスキーマ上のテーブルに適用される、で正しいでしょうか? また、既存テーブルと新規テーブルという意味では、既存テーブルには影響を与えない、らしいのですが、そうなのでしょうか? 新しくテーブルを作成した場合にのみCharベースになるということでしょうか。その場合、既存テーブルもCharベースに変更するにはどのような手順を踏めばよいのでしょうか?(例)テーブルのエクスポート→テーブルのドロップ→テーブル再作成→データのインポート?など、思いつきですがよい方法があれば教えてください) 以上、宜しくお願いします。

  • JIS X 0213で定義されているのは6,879字それとも11,233字?

    JIS X 0213には第3水準漢字、第4水準漢字、非漢字(英数字、仮名、記号など)659字、計4,354字の文字とその文字コードが定義されていると聞きました。しかし、JIS X 0213には、第1水準漢字、第2水準漢字、非漢字524字の計6,879字も併せて合計で11,233字が収録されているとも聞きました。 質問1 この4,354字と11,233字の差はどのように考えたらよいのでしょうか。JIS X 0213で定義されたのが4,354字、JIS X 0208で定義されたのが6,688字、JIS X 0201で定義されたのが191字であり、JIS X 0213ではそれらの全てを、定義しているわけではないが、表示はしているということでしょうか。 質問2 また、もし表示はしているということであれば、その表示はJIS X 0213のどの部分においてさなれているのでしょうか。 http://www.jisc.go.jp/app/pager?id=13864 にJIS X 0213の一覧があるのは分かるのですが、このうちのどこに表示されているのか分かりません。

  • 文字のバイトサイズの取得

    25バイト以上ある文字配列を25バイトまでに切り取りたいのです。 全て半角英数ならstr.substring(0 ,25)ですみますが 日本語も入っているのでsubstringが使えません。 そこで,バイト配列を使おうと思ったのですがうまくいきません。どうかお願いします。 例) String E = "AAAAAAAAAAAAAあああああああ"; byte S[] = new byte[100]; S=E.getBytes(); ByteArrayOutputStream out = new ByteArrayOutputStream(); for(int n = 0; n < 25 ; ++n){ out.write(S[n]); } System.out.println(out.toByteArray()); 結果として"AAAAAAAAAAAAAあああ"が出力されてほしい

    • ベストアンサー
    • Java
  • 記号は文字の仲間?

    たとえば数字ですが、ウィキペデァで調べると >数とは物の数量などを表現しているのに対して、数字とは数を表すための記号(文字)である。 http://ja.wikipedia.org/wiki/%E6%95%B0%E5%AD%97 この定義ですと数字が記号(文字)ならば、文字らしきものはすべて文字ということになると思いますが、漢字やカナなどの文字は、しばしば記号や数字と区別されていますので、文字と記号は別だと思ってました。 正確な区別というのはあるのでしょうか?

  • シフトJIS 2バイト字の範囲

    シフトJISの2バイト文字の範囲は 0x40~0x7e と 0x80~0xfc と 0x40~0xfc のどっちですか? どちらの情報も見たことがあるんです。 シフトJISの文字をマッチングさせる場合、 ここでは見やすく、スペースを入れて / [\x81-\x9f] [\x40-\xfc] | [\xe0-\xfc] [\x40-\xfc] / とした場合、例えば、亜a という文字列があったら 亜 の2バイト目(下位ニブルっていうのかな)が 9F で b は16進で 62 だから、亜 の2バイト目と a が、 2バイトのシフトJISとしてこれにマッチしてしまうんです。 シフトJISで、こういう例外処理を書かずに、 全てに適用できるシフトJIS2バイトマッチのソースが あれば教えてください。

    • ベストアンサー
    • CGI
  • NLS_CHARSETの変更について

    Oracle8i環境のデータベースで文字化けが発生しています。 データベース作成時に、管理者が文字コードを指定するのを忘れてしまい、 NLS_CHARSETが US7ASCII となっています。 (本来はJA16SJISが正しい) 既にテーブルも作成され、データも挿入されているので、 なんとかデータベースの再作成は避けたいのですが、 何か方法がありますでしょうか? (例えばALTER DATABASE文などで・・・) よろしくお願いいたします。

  • 2バイトって何文字分ですか?

     記憶容量のことで、お聞きします。1biteは、8bitっていうことは、雑誌などで読んで知っているのですが、イメージが湧きません。  日本語は2バイト必要だといわれていますが、1バイトでもしくは、2バイトで何文字分の保存が可能ですか?2バイトで、日本語すべての文字の保存が可能ですか? 2HDFDは、1.44MBっていうのが、多いようですが、最大何文字保存可能なんでしょうか?どなたか、よろしくお願いいたします。

  • Javaで、半角カナを2バイトとしてカウントしたい

    JavaでSJISで入力された文字列(全角、半角、英字、記号等混在)の桁数チェックで、 入力された半角カナのバイト数を、2バイトとみなしてカウントしたいと考えています。 例えば  全角の"テスト"の場合、バイト数は6  半角の"テスト"の場合も、バイト数は6 Javaで以下の様にコーディングしたところ、半角カナ部分はとりあえずうまく行ったのですが、 System.out.println 半角の"テスト".getBytes("EUC-JP").length; ->6 特殊な文字「まるの1、まるの2」等で試すと、特殊な文字のバイト数が1バイトとして カウントされてしまいます。 ※まるの1、まるの2は、この質問フォームで入力できないのでこの記載としています。 以降は(1),(2)と記載します。いずれも全角1文字の文字のことです。 System.out.println "(1)".getBytes("EUC-JP").length;   ->1      ※希望結果は2バイト System.out.println "(2)スト".getBytes("EUC-JP").length;   ->5      ※希望結果は6バイト 特殊な文字「(1)、(2)」や半角カナ(2バイトとしてカウント)を含めて、 簡単にバイト数をカウントすることはできないでしょうか。

  • ソート(大文字・小文字を区別しない方法)

    Oracle10gとOracle9を利用しています。 SQL文でソートした結果を出力したいのですが、頭文字が大文字・小文字が混在しています。 ORDER BY句を使ってソートをすると、大文字でソート、小文字でソート という順番で並ぶと思いますが、大文字・小文字を区別せずにソートさせたいと考えています。 大文字・小文字を区別せずにソートさせる方法はありますか? ------------- TABLE1 ------------- ID NAME ------------- 001 Book 002 bar 003 boy 004 Byte ------------- SELECT NAME FROM TABLE1 ORDER BY NAME; ↓実行結果 ------------- Book Byte bar boy ------------- ↓出力した並び順 ------------- bar Book boy Byte ------------- ※「ALTER SESSION ST NLS_SORT=BINARY_CI」としてからソートすればOKという  情報がネットで見つかりましたが、Webアプリの中で実行させたいため、設定  は変えずに行いたいと思っています。可能ですか? よろしくお願いいたします。

  • zipファイルのパスワードに関して

    zipファイルにパスワードをつける場合、パスワードの文字数制限はあるのでしょうか。それと全角のかなや漢字や記号なども使えるのでしょうか?また、JIS第2水準漢字なども使えるのでしょうか?(入力にはコピペを使いたいと思います)