データベースフィールドが255文字の大きさに設定されているのをよく見ますが、伝統的/歴史的な理由は何ですか?私はそれがページング/メモリ制限とパフォーマンスに関係していると思いますが、255と256の違いはいつも私を混乱させました。
varchar(255)
これが容量または大きさであると考えると、インデクサーではありません、256より256が好ましいのはなぜですか?目的(ターミネータまたはヌルまたは何か)?
おそらくvarchar(0)はナンセンスです(容量がゼロです)?その場合、2 ^ 8のスペースは確実に256になりますか?
パフォーマンス上の利点を提供する他の規模はありますか?たとえば、varchar(512)やvarchar(510)よりもvarchar(512)のパフォーマンスは低いですか?
この値は、古いものと新しいもののすべての関係データベースで同じですか?
免責事項-私はDBAではなく開発者です。既知のビジネスロジックに適したフィールドサイズとフィールドを使用していますが、historic関連性がなくなった場合でも、この設定の理由(ただし関連性がある場合はそれ以上)。
回答のおかげで、サイズを格納するためにバイトが使用されるというコンセンサスがあるように見えますが、これは私の心の中で決定的に問題を解決しません。
メタデータ(文字列の長さ)が同じ連続したメモリ/ディスクに保存されている場合、ある程度意味があります。 1バイトのメタデータと255バイトの文字列データは、互いに非常にうまく適合し、256個の連続したストレージバイトに収まります。
しかし...メタデータ(文字列の長さ)が実際の文字列データとは別に(おそらくマスターテーブルに)格納されている場合、1バイトの整数のみを格納する方が簡単だという理由だけで、文字列のデータの長さを1バイトに制限しますメタデータが少し奇妙に思えます。
どちらの場合も、おそらくDBの実装に依存する微妙な問題のように思われます。 255を使用する慣行はかなり普及しているように見えるので、どこかで誰かが最初にそれについて良いケースを主張したに違いありません。プログラマーは、理由なしに新しいプラクティスを採用することはありません。これはかつて新しいものであったに違いありません。
最大255文字の長さで、DBMSは1バイトを使用してフィールド内のデータの長さを示すことを選択できます。制限が256以上の場合、2バイトが必要になります。
長さゼロの値は、varchar
データに有効です(特に制約がない限り)。ほとんどのシステムはそのような空の文字列をNULLとは異なるものとして扱いますが、一部のシステム(特にOracle)は空の文字列をNULLと同じように扱います。空の文字列がNULLではないシステムの場合、値をNULLと見なすべきかどうかを示すために、行のどこかに追加ビットが必要になります。
ご指摘のとおり、これは歴史的な最適化であり、おそらく今日のほとんどのシステムには関係ありません。
255は、1バイトの符号なし整数(8ビットバイトを想定)に格納できる最大の数値です。したがって、何らかの目的で文字列の長さを格納するアプリケーションは、必要なことだけであるため、256よりも255を優先します。 「サイズ」変数に1バイトを割り当てます。
MySQLマニュアルから:
データ・タイプ :
VARCHAR(M)、VARBINARY(M)必要なストレージ:
列の値に0〜255バイトが必要な場合はL + 1バイト、値に255バイト以上が必要な場合はL + 2バイト
理解して選択してください。
255は8ビット整数の最大値です:11111111 = 255。
最大長が255の場合、データベースエンジンは各フィールドの長さを格納するために1バイトのみを使用できます。 1バイトのスペースを使用すると、文字列の長さに対して2 ^ 8 = 256個の異なる値を格納できます。
ただし、フィールドに長さゼロのテキスト文字列を格納できるようにする場合は、長さゼロを格納できる必要があります。したがって、0から始まる256個の異なる長さの値を許可できます:0-255。
多くの場合、varcharはPascal文字列として実装され、バイト#0に実際の長さを保持します。したがって、長さは255にバインドされていました(バイトの値は0から255まで変化します)。
<<
ビット/バイトストレージの基本を思い出すと、256未満の整数を格納するには1バイト、256〜65536の整数では2バイトが必要です。したがって、511または512を格納するには同じスペース(2バイト)が必要です。 ....したがって、上記の議論で言及されたthis引数がvarchar(512)またはvarchar(511)の場合は該当しないことは明らかです。
8ビット符号なし= 256バイト
255文字+長さはバイト0
以前は、すべての文字列にNULターミネータまたは「バックスラッシュゼロ」が必要でした。更新されたデータベースにはそれがありません。 「255文字のテキスト」と「\ 0」が最後に自動的に追加されたため、システムは文字列の終了位置を認識していました。 VARCHAR(256)と言った場合、結果は257になり、1文字の次のレジスタに移動します。無駄だ。そのため、すべてがVARCHAR(255)とVARCHAR(31)でした。習慣から、255はくっついているようですが、31は32になり、511は512になりました。その部分は奇妙です。自分でVARCHAR(256)を書くのは難しいです。
これはあなたの質問に答えるかもしれないと思います。以前のシステムでは、varcharの最大制限だったようです。私は別のstackoverflowの質問からそれを取りました。
もちろん、最も長い郵便住所が何であるかを知るのは難しいので、多くの人がどの住所よりも確実に長い長いVARCHARを選択するのはこのためです。また、255は、夜明けの一部のデータベース(および最近までのPostgreSQL)でのVARCHARの最大長であった可能性があるため、慣習的です。
データはバイナリシステムのメモリに保存され、0と1は2進数です。 1バイト(8ビット)に収まる最大の2進数は11111111で、10進数の255に変換されます。