3

a を定義しvarchar(25)、文字列が 25 文字未満 (たとえば 12 文字) の場合、SQL は char のベクトルを長さ 12 として表示し、(文字とは異なり) 末尾のスペースは追加されません。

私の質問は次のとおりです。SQL がフィールドに挿入された (または最大長よりも長い場合は切り捨てられた) 文字列のみを表示するという事実の背後にあるのは、Postgresql がそのようなデータ型をどのように格納しているのかということです。

次のように余分なバイトをパディングしていますか?

12charxx...................... (長さ: 25)

それとも12バイトを保存するだけですか?

これは内部的にもっと複雑になる可能性があると思います。maximum-lengthオプションの引数が大きな文字列の格納を禁止するための安全なのか、それとも単にパフォーマンスの問題なのか (すべてのサブシーケンスに格納された文字列が 25 文字以下であると予想されるかどうかに関して)を知る必要があります。

4

2 に答える 2

3

SQL は 2 つの主要な文字型を定義します。文字が可変 (n) と文字 (n) です。ここで、n は正の整数です。これらのタイプは両方とも、最大 n 文字の長さの文字列を格納できます。これらの型の列に長い文字列を格納しようとすると、余分な文字がすべてスペースでない限り、エラーが発生します。その場合、文字列は最大長に切り捨てられます。(このやや奇妙な例外は、SQL 標準で必要です。) 格納される文字列が宣言された長さよりも短い場合、文字型の値はスペースで埋められます。文字が変化するタイプの値は、短い文字列を単純に格納します。

短い文字列 (最大 126 バイト) のストレージ要件は、1 バイトに実際の文字列を加えたもので、これには文字の場合のスペース パディングが含まれます。より長い文字列には、1 ではなく 4 バイトのオーバーヘッドがあります。

最後に

ヒント: これらの 3 つのタイプの間にパフォーマンスの違いはありません。ただし、空白が埋め込まれたタイプを使用する場合のストレージ サイズの増加と、長さの制約のある列に保存する場合の長さをチェックするための余分なサイクルがいくつかあることは別としてです。character(n) は他のデータベース システムではパフォーマンス上の利点がありますが、PostgreSQL ではそのような利点はありません。

ここから

于 2013-05-13T14:57:40.447 に答える
0

ドキュメントvarcharによると、パディングは保存されません。しかし、そうです。文字列の長さを格納する際にもオーバーヘッドが発生します。character

于 2013-05-13T14:56:40.973 に答える