あなたの習慣について教えてください!!

データベースのテーブルのカラムのサイズを定義しようとしています。調べた限りでは、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にすることで文字数ベースにすることができるとも聞いたのですがこのアプローチは推奨されますか?全てのテーブルに影響があると思うので、大きな決断になると思うのですが普及したやり方なのでしょうか?

以上、見解を教えて頂けると助かります。以上、宜しくお願いします。

A 回答 (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社のプリセール
スくらいです。実績が少ないパラメータをみだりに設定することで、未曾有のバ
グに遭遇するリスクがあるため奨めしません。
    • good
    • 1
この回答へのお礼

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

お礼日時:2014/01/26 08:18

> これは、「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文を見たら分かるという風にしている。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報