
データベースのテーブルのカラムのサイズを定義しようとしています。調べた限りでは、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にすることで文字数ベースにすることができるとも聞いたのですがこのアプローチは推奨されますか?全てのテーブルに影響があると思うので、大きな決断になると思うのですが普及したやり方なのでしょうか?
以上、見解を教えて頂けると助かります。以上、宜しくお願いします。
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社のプリセール
スくらいです。実績が少ないパラメータをみだりに設定することで、未曾有のバ
グに遭遇するリスクがあるため奨めしません。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- C言語・C++・C# VisualStudioのソースコードで漢字を使いたい 4 2022/05/21 10:16
- UNIX・Linux Postfixでドコモメールに送信すると届くまで10分ぐらいかかる 6 2023/03/05 13:56
- Android(アンドロイド) 海外のAndroid 端末の場合、日本語全角は、どう表示されるのでしょうか? 1 2022/10/02 21:16
- その他(プログラミング・Web制作) 2つのテキストファイルを比べて文字列を特定する方法を教えて下さい 5 2022/05/01 15:22
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- C言語・C++・C# 【C言語】全角文字の配列を、全角のまま1文字ずつ出力する方法 4 2023/05/09 15:08
- Access(アクセス) Accessのテキストボックスの入力文字制限 1 2023/01/18 20:43
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
2バイト文字を一括削除するマクロ
-
実行計画の「COST」と「BYTE」...
-
磁気ディスク装置の問題
-
転送時間について
-
EXCELでの16進数取り出し、上...
-
文字の容量(サイズ)についての...
-
携帯電話の略語であるMBって英...
-
GB と Gbの違いの意味
-
KとKB
-
1Mバイトって何バイト?
-
K KB MB について詳し...
-
1MBって何K?
-
ビットもバイトもkは×1024?
-
文字列をバイト数分表示するには?
-
CSV データのバイト数を調べる...
-
ROWIDの桁数
-
【有効数字について】 授業で、...
-
エクセルでビット1をカウント J...
-
Pentium 4とPentium Mの性能差...
-
組み込みCプログラムで実数型
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELでの16進数取り出し、上...
-
携帯電話の略語であるMBって英...
-
文字の容量(サイズ)についての...
-
実行計画の「COST」と「BYTE」...
-
アルファベット30文字は何バイ...
-
KBのMB違いって
-
CSV データのバイト数を調べる...
-
GB と Gbの違いの意味
-
1Mバイトって何バイト?
-
KBとMB
-
Excel_VBAで改行コードの無いフ...
-
Pingについてご教授ください。
-
おねがいします。
-
K KB MB について詳し...
-
32bit = 4GB(バイト)?
-
Oracle AL32UTF8でのバイトサイ...
-
2バイト文字を一括削除するマクロ
-
16進数どうしの乗算
-
5000KBytes/sをbitに変換するには
-
byte、KB、MB の単位の変換につ...
おすすめ情報