テーブルを作る際に、
CREATE TABLE TableName (
id INTEGER,
value VARCHAR(255),
PRIMARY KEY(id)
);
や
CREATE TABLE TableName2 (
id INTEGER,
value VARCHAR(256),
PRIMARY KEY(id)
);
などのように、カラムの桁数を「2の階乗数」または「2の階乗数-1」といった数にしている例をたまに見かけます。
これは何か重要な意味のある事なのでしょうか?
また、「2の階乗数」と「2の階乗数-1」ではどちらかがより適切である、といった違いはあるのでしょうか。
ちなみに特に興味があるDBMSはMySQLとPostgres SQLです。
よろしくお願いします。
MySQLの場合、以前のバージョンではVARCHAR型の長さは255が最大でした。
なので、取りうる最大値という意味ですね。最大と言っても可変長なので常にその長さを取るわけではありませんので、なるべく長く取っておくという意味もあります。
また256は単に2進数上きりがいいから、その長さにする。256-1は文字列のヌルターミネートが不要な場合1文字少なくできる。という理由も考えられます。
但し、256を超えると、可変長の長さを表す領域が1バイトから2バイトに増えるので、テーブルが余計に大きくなります。
データベースは単体ではなく何らかのアプリケーションでユーザーインターフェースを準備することになりますので、他のアプリケーションとの互換性などを考えて254~256(アプリケーションによって際はあるがこの範囲でトラブルになることはまずない)にすることは多いです。
ありがとうございます。
>データベースは単体ではなく何らかのアプリケーションでユーザーインターフェースを準備することになります
>他のアプリケーションとの互換性などを考えて
そうですね。これはよくわかる気がします。
しかし、254~256にしておけばトラブルになることはまずないという理由がよくわかりません……私の経験不足でしょうか。ううむ。
http://oshiete.nikkeibp.co.jp/kotaeru.php3?qid=2348115
やはり、16進数で割り切れる数にしたほうが、カラムの変更などがあった場合にも泣きを見ることも少なく、また、プリミティブな処理では、処理が早かったリするようです。
ありがとうございます!
なるほど。16進数で割り切れる数だと処理が早い、というのはなんとなくわからないでもない印象を受けますね。。。
ケチケチしてぎりぎりのサイズにするというのは賢くない事なのですね。
http://dev.mysql.com/doc/refman/5.0/en/char.html
前の答えにもありましたが、最近のMySQLでは65535字まで入るそうだから、これ以下の数字なら何でもいいんじゃないですか。むかしの習慣を引きずって、255でも切りがよくていいですし。ちなみにこれ、むかしはバイト単位、今は字数単位ということですから話はややこしいです。
http://www.postgresql.jp/document/current/html/datatype-characte...
PostgreSQLの場合は、VARCHARまたはTEXT型は長さ指定なしで、約1GBまでOKということですから、わたしはもっぱらVARCHARだけで長さ指定せずに使っています。データが入る前に何字入るか想像するのがめんどくさいからです。
ありがとうございます!
In contrast to CHAR, VARCHAR values are stored using only as many characters as are needed, plus one byte to record the length (two bytes for columns that are declared with a length longer than 255).
そ、そうなんですね……あぁ、そういうことなのかぁ。
なんかちょっと一人で勝手に納得しました。
>ちなみにこれ、むかしはバイト単位、今は字数単位ということですから話はややこしいです。
ややこしいですね~。如何なる理由があったのかわかりませんが。。。
>PostgreSQLの場合は、VARCHARまたはTEXT型は長さ指定なしで、約1GBまでOKということですから、わたしはもっぱらVARCHARだけで長さ指定せずに使っています。
なるほど。
今はそれほど固く考えなくてもいいんですかね。それだったら気楽でいいですね。
各データを保存する場合、データを保存する型に応じて
データを保存する領域が必要です。
以下のように固定サイズの場合通常 2^N
可変データの場合(2^N-1)のサイズがデータを
保存する領域として為に必要になります。
ディスク容量、CPU性能が低い時代1バイト
で長さを管理する場合0~255となる。
全体の長さを可変の場合、長さを管理する1バイト
の情報が最低必要となり合計256バイトとなる。
これはCPUが、1バイトの長さのデータなら
効率よく処理できたなごりでもあります。
又昔は文字の場合1文字=1バイトの意味もありました。
アプリを作成する場合、著名なデータベース oracle,
sybase、db2(udb)等互換性の歴史があるので
管理方法により微妙な上限値の違いがあります。
http://www.itmedia.co.jp/enterprise/0308/24/epn02_4.html
なぜ上限に近い値を大抵使うのかと言うのか?
大抵の場合を決める人に根拠はない場合が多いと
思ってます。データベースの定義を小さくするのは
リソースがへるので問題が発生しにくいですが、
多くする場合は後でリソース、性能低下等
困った事になります。
大抵の場合は、設計資料に具体的な根拠か将来的計画
がない時は、後で何があっても問題ないように大目に定義
しているだけと思います。 プログラム側でも最大の固定
サイズで領域を確保しておけば増える場合より減る場合の方が
より対処範囲が少ないと思います。
6.2.6. 各カラム型に必要な記憶容量
http://dev.mysql.com/doc/refman/4.1/ja/storage-requirements.html
8.1. 数値データ型
http://osb.sra.co.jp/PostgreSQL/Manual/PostgreSQL-8.0-ja/datatyp...
8.3. 文字型
http://osb.sra.co.jp/PostgreSQL/Manual/PostgreSQL-8.0-ja/datatyp...
詳細な説明ありがとうございます。
>固定サイズの場合通常 2^N
>可変データの場合(2^N-1)のサイズがデータを
>保存する領域として為に必要になります。
>大抵の場合は、設計資料に具体的な根拠か将来的計画
>がない時は、後で何があっても問題ないように大目に定義
>しているだけと思います。
ずばりと書いていただいて、良くわかりました。
お蔭様ですっきりです。
感謝。
ありがとうございます。
>MySQLの場合、以前のバージョンではVARCHAR型の長さは255が最大でした。
おぉ、そうなんですか。それはなんともわかりやすい理由ですねw
>256-1は文字列のヌルターミネートが不要な場合1文字少なくできる
うーん……ごめんなさい理解力不足のせいでよく把握できません。
文字列の格納時に、必ずヌルターミネートを切り捨てるという前提に立ったときの設計、ということでしょうか?
なんだか全然違うような気もしますが……
>但し、256を超えると、可変長の長さを表す領域が1バイトから2バイトに増えるので、テーブルが余計に大きくなります。
逆に言うと、256までであればどの値に設定しても1バイトだから変わりはないよ、という事でしょうか。
だとしたら取り敢えず256にしておく、というのはわからないでもないですね。