データベースのテーブルのカラムのサイズを定義しようとしています。調べた限りでは、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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
電子透かしを使用した場合の著...
-
文字の容量(サイズ)についての...
-
文字数5000字、文字コードが2バ...
-
K KB MB について詳し...
-
アルファベット30文字は何バイ...
-
マトリックスサイズが512×512で...
-
メモリーの単位を解説してくだ...
-
(*^_^*) キロバイトと字数の...
-
1KBは、2の8乗X1000ではない...
-
携帯電話の略語であるMBって英...
-
W2KのKって、KBのK?
-
ギガバイト メガバイト この違...
-
Stirlingについて
-
KBのMB違いって
-
1Mバイトって何バイト?
-
【有効数字について】 授業で、...
-
1TBHDDに音楽ファイルは何ア...
-
パイプライン処理の処理能力に...
-
組み込みCプログラムで実数型
-
エクセルVBAで xlOn xlOff の切替
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELでの16進数取り出し、上...
-
KBとMB
-
文字の容量(サイズ)についての...
-
携帯電話の略語であるMBって英...
-
KBのMB違いって
-
実行計画の「COST」と「BYTE」...
-
1Mバイトって何バイト?
-
32bit = 4GB(バイト)?
-
アルファベット30文字は何バイ...
-
GB と Gbの違いの意味
-
K KB MB について詳し...
-
Oracle AL32UTF8でのバイトサイ...
-
2バイト文字を一括削除するマクロ
-
カナカナの(半)濁点がついた文...
-
CSV データのバイト数を調べる...
-
マトリックスサイズが512×512で...
-
新聞1ページは何バイトですか?...
-
1Mbpsって毎秒何キロバイト?
-
DVD-R 4.7GBって、何byte でし...
-
(*^_^*) キロバイトと字数の...
おすすめ情報