なぜ歴史的にデータベースフィールドの大きさに256ではなく255を使用するのでしょうか。


188

255文字の大きさに設定されたデータベースフィールドをよく目にしますが、なぜ伝統的/歴史的な理由なのですか?私はそれがページング/メモリ制限とパフォーマンスに関係していると思いますが、255と256の違いは常に私を混乱させました。

varchar(255)

これがインデクサーなく容量または大きさであることを考えると、なぜ256は256よりも255が推奨されますか?バイトは何らかの目的(ターミネーターまたはnullなど)のために予約されていますか?

おそらくvarchar(0)はナンセンスです(容量がゼロです)?どちらの場合、2 ^ 8のスペースは確かに256である必要がありますか?

パフォーマンス上の利点を提供する他の大きさはありますか?たとえば、varchar(512)はvarchar(511)またはvarchar(510)よりもパフォーマンスが低いですか?

この値は、新旧のすべてのリレーションデータベースで同じですか?

免責事項 -私はDBAではなく開発者です。既知のビジネスロジックに適したフィールドサイズとフィールドタイプを使用しますが、この設定の歴史的な理由を知りません。それがまだ関連している場合はより多く)。

編集:

答えをありがとう、サイズを格納するためにバイトが使用されるといういくつかの合意があるようですが、これは私の心の中で決定的に問題を解決するものではありません。

メタデータ(文字列の長さ)が同じ連続したメモリ/ディスクに格納されている場合、それはある程度の意味があります。1バイトのメタデータと255バイトの文字列データは非常にうまく適合し、256の連続したストレージのバイトに適合します。これはおそらくきちんと整頓されています。

しかし...メタデータ(文字列の長さ)が実際の文字列データとは別に(おそらくマスターテーブルに)格納される場合、1バイトの整数のみを格納する方が簡単だからといって、文字列のデータの長さを1バイトに制限します。メタデータの部分は少し変わっているようです。

どちらの場合も、おそらくDBの実装に依存するのは微妙なことのようです。255を使用する習慣はかなり広まっているように思われるので、最初にどこかで誰かがその良い事例について議論したに違いありません。プログラマーは理由なしに新しい慣行を採用することはありません。


3
なぜなら、文字カウントは0からN-1までで始まるからです。したがって、256文字はvarchar(255)として宣言されます。間違えない限り。
ブハケシンディ

3
たぶん、ITの人々は1ではなく0から数え始めるからでしょう;)?
Romain Linsolas、2010

私はそれが古い学校のプログラマーに関係していると思います。
グランピー

7
@Elite Gentleman:いいえ、括弧内の数字は実際の長さです... C配列宣言のように:x [256]はx [0] ... x [255]を与えます。
RedPandaCurios 2010

@romaintaz-ただし、1つのアイテムを格納できる配列を検討してください。あなたはそれに何か[1]を宣言し、それにアクセス[0]します。問題は、なぜSQLでは容量が一見論理よりも1バイト少ないと宣言するのかということです。
Andrew M

回答:


167

最大長は255文字です。DBMSは、フィールド内のデータの長さを示すために1バイトを使用することを選択できます。制限が256以上の場合、2バイトが必要になります。

長さゼロの値は、varcharデータに対して確かに有効です(他に制約がない限り)。ほとんどのシステムはそのような空の文字列をNULLとは異なるものとして扱いますが、一部のシステム(特にOracle)は空の文字列をNULLと同じように扱います。空の文字列がNULLではないシステムの場合、行のどこかにビットを追加して、値をNULLと見なすかどうかを示す必要があります。

お気づきのように、これは歴史的な最適化であり、今日のほとんどのシステムにはおそらく関係ありません。


長さのバイトを予約することは理にかなっていますが、2番目のパラグラフ、おそらく長さゼロの/ value /は有効ですが、長さゼロの/ capacity /は有効ですか?
アンドリューM

1
@Andrew:試したところ、PostgreSQLが拒否しましたvarchar(0)。値は空の文字列またはNULLの2つに過ぎない可能性があるため、おそらくそれほど役に立ちません。そのために単にを使用するbitこともできます。
グレッグヒューギル

したがって、容量メタデータがデータ自体と同じ連続したブロックに格納されていると想定することは真実です。したがって、DBには、これら2つの要素(データとメタデータ)の合計を1つのページ(おそらく256)内に保持するという利点があります。バイト)?
Andrew M

@Andrew:問題となっているDBMSの実装の詳細に応じて、これは当てはまる場合と当てはまらない場合があります。通常、ページサイズは256バイトよりはるかに大きくなります。すでに述べたように、この種の最適化は重要な場合があります(たとえば、何十億もの小さな行を格納している場合など)が、ほとんどの場合、心配する価値はありません。
グレッグヒューギル

3
ディスクスペース(およびインデックススペース)の重要性は、256が1ページに収まる可能性があるためではなく、1バイトと2バイト(数百万、数十億、数兆行)の違いが大きいためです。
ypercubeᵀᴹ

35

255は、mySQL4以前のvarchar制限でした。

また、255文字+ヌルターミネータ= 256

または、1バイトの長さの記述子で、0〜255文字の範囲を指定できます


またchar foo[256]、メモリ管理は2の累乗を好むため、読み取りは重要です。参照:stackoverflow.com/questions/3190146 / ... 割り当てるchar foo[257]と、メモリが断片化するか、512バイトを占有します。
ebyrob 2017年

4
varcharは文字列の長さを格納しないので、nullターミネーターは必要ありませんか?
ランチャー2017

19

255は、シングルバイトの符号なし整数(8ビットバイトを想定)に格納できる最大の数値です。そのため、ある目的のために文字列の長さを格納するアプリケーションは、256以上ではなく255を優先します。 「サイズ」変数に1バイトを割り当てます。


17

MySQLマニュアルから:

データ・タイプ :
VARCHAR(M)、VARBINARY(M)

必要なストレージ:
列の値が0〜255バイトを必要とする場合はL + 1バイト、値が255バイトを超える場合はL + 2バイト

理解して選択してください。


はい、ただしM represents the declared column length in characters for nonbinary string types and bytes for binary string types. L represents the actual length in bytes of a given string value. dev.mysql.com/doc/refman/5.7/en/storage-requirements.html
DLight


7

最大長は255で、データベースエンジンは1バイトのみを使用して各フィールドの長さを格納できます。1バイトのスペースを使用すると、文字列の長さに2 ^ 8 = 256の異なる値を格納できることに間違いはありません。

ただし、フィールドに長さゼロのテキスト文字列を格納できるようにする場合は、長さにゼロを格納できる必要があります。したがって、0から始まる256の異なる長さの値を許可できます:0-255。


6

多くの場合、varcharはパスカル文字列として実装されます。実際の長さはバイト#0に保持されます。したがって、長さは255にバインドされていました(1バイトの値は0から255まで変化します)。


5

<<

ビット/バイトストレージの基本を思い出しました。256未満の整数を格納するには1バイト、256〜65536の整数には2バイトが必要です。したがって、511または512を格納するには同じスペース(2バイト)または65535が必要です。 ....したがって、上記の説明で述べたこの引数は、varchar(512)またはvarchar(511)ではN / Aであることは明らかです。


4

符号なし8ビット= 256バイト

255文字+バイト0の長さ


3

以前は、すべての文字列にNULターミネータ、つまり「バックスラッシュゼロ」が必要でした。更新されたデータベースにはそれがありません。これは「255文字のテキスト」で、末尾に「\ 0」が自動的に追加されたため、システムは文字列の終了位置を認識していました。VARCHAR(256)と言った場合、結果は257になり、次のレジスタに1文字入ります。もったいない。そのため、すべてがVARCHAR(255)およびVARCHAR(31)でした。習慣的に、255は動かなくなったようですが、31は32に、511は512になりました。その部分は奇妙です。VARCHAR(256)を自分で書くのは難しいです。


0

これはあなたの質問に答えるかもしれません。以前のシステムではvarcharの上限だったようです。私は別のスタックオーバーフローの質問からそれを取りました。

もちろん、最長の郵便住所が何であるかを知ることは困難です。そのため、多くの人が、どの住所よりも確実に長い長いVARCHARを選択しています。また、255は通常、一部のデータベースではVARCHARの最大長であった可能性があるため、慣例となっています(最近までのPostgreSQLと同様)。

すべてのテキストベースのフィールドに汎用のvarchar(255)を使用することには欠点がありますか?


0

データはバイナリシステムでメモリに保存され、0と1は2進数です。1バイト(8ビット)に収まる最大の2進数は11111111で、10進数の255に変換されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.