私はa_horse_with_no_nameが言ったことすべてに同意します。そして、私は一般的にErwinのコメントアドバイスに同意します:
いいえ、charは劣っています(そして時代遅れです)。textとvarcharは(ほぼ)同じ動作をします。
メタデータ
1マイナーの例外を除いて、唯一の時間Iの使用はchar()
、私はこれを言うためにメタデータが必要な場合であるしなければならないのx文字を持っています。char()
入力が制限を超えている場合にのみ文句を言うことは知っていますが、CHECK
制約のアンダーランから頻繁に保護します。例えば、
CREATE TABLE foo (
x char(10) CHECK ( length(x) = 10 )
);
INSERT INTO foo VALUES (repeat('x', 9));
これにはいくつかの理由がありますが、
char(x)
スキーマローダーでは固定幅の列であると推測される場合があります。これにより、固定幅文字列用に最適化された言語に違いが生じる可能性があります。
- それは理にかなっており、簡単に施行される規則を確立します。この規則からコードを生成する言語でスキーマローダーを書くことができます。
私がこれを行う場所の例が必要です、
- 2文字の州の略語ですが、このリストは列挙できるため、通常はで行います
ENUM
。
- 車両識別番号
- モデル番号(固定サイズ)
エラー発生時
一部の人々は、制限の両側のエラーメッセージの不一致に不快感を覚えるかもしれませんが、それは私を悩ませません
test=# INSERT INTO foo VALUES (repeat('x', 9));
ERROR: new row for relation "foo" violates check constraint "foo_x_check"
DETAIL: Failing row contains (xxxxxxxxx ).
test=# INSERT INTO foo VALUES (repeat('x', 11));
ERROR: value too long for type character(10)
と対比 varchar
さらに、上記の提案は、ほぼ常にuseのtext
規則に非常によく適合すると思います。あなたも質問しvarchar(n)
ます。私はそれを決して使用しません。少なくとも、前回使っvarchar(n)
たときのことは思い出せません。
- 仕様に信頼できる静的な幅のフィールドがある場合は
char(n)
、
- それ以外の場合、
text
効果的に使用しますvarchar
(制限なし)
意味のある可変長テキストキーがあり、最大長が一定であると信頼している仕様を見つけた場合は、 varchar(n)
ます。ただし、その基準に合うものは考えられません。
その他の注意事項
関連するQ&A: