この回答( https://stackoverflow.com/questions/517579/strings-as-primary-keys-in-sql-database )では、1つのコメントが私の目を引きました:
また、インデックスの比較を行う場合、CHARとVARCHARの間には非常に大きな違いがあることが多いことに注意してください。
これはPostgresにも適用されますか?
CHAR
は多かれ少なかれVARCHAR
のエイリアスであると主張するOracleのページを見つけたので、インデックスのパフォーマンスは同じですが、Postgresで決定的なものは何も見つかりませんでした。
CHAR
およびVARCHAR
は、Postgres(およびOracle)でもまったく同じように実装されます。これらのデータ型を使用しても速度に違いはありません。
ただし、canがパフォーマンスに影響を与えるという違いが1つあります。char
列は常に定義された長さに埋め込まれます。したがって、列をchar(100)
として定義し、1つをvarchar(100)
として定義するが、それぞれに10文字しか格納しない場合、char(100)
列は各値に100文字を使用します(10 varchar
列には10文字しか保存されませんが、保存した文字と90個のスペース)。
100文字と100文字を比較すると、10文字と10文字を比較するよりも遅くなります。ただし、SQLクエリでこの違いを実際に測定できるかどうかは疑問です。
両方を10文字の長さで宣言し、常に正確に 10文字を格納する場合、違いはまったくありません(これはOracleとPostgresに当てはまります)。
したがって、唯一の違いは、char
データ型に対して行われるパディングです。
また、インデックスの比較を行う場合、CHARとVARCHARの間には非常に大きな違いがあることが多いことに注意してください。
上記の引用はonly trueであり、char
列の幅が広すぎると定義されている(つまり、パディングのためにスペースを浪費している)場合に限ります。 char
列の長さが常に完全に使用されている(つまり、パディングが発生していない)場合、上記の引用は正しくありません(少なくともPostgresおよびOracleの場合)。
私の観点からは、char
データ型は実際にはWordで使用されません。 varchar
(またはPostgresではtext
)を使用し、char
が存在することを忘れてください。
私はすべてに同意します said by a_horse_with_no_name、そして私は一般的にアーウィンのコメントアドバイスに同意します:
いいえ、charは劣っています(そして時代遅れです)。 textとvarcharは(ほぼ)同じように動作します。
1つのマイナーな例外を除いて、onlyを使用する時間char()
は、メタデータでこれを言いたいときです[〜#〜] must [〜#〜]にはx文字があります。 char()
は、入力が制限を超えた場合にのみ文句を言うことを知っていますが、CHECK
制約のアンダーランから頻繁に保護します。例えば、
_CREATE TABLE foo (
x char(10) CHECK ( length(x) = 10 )
);
INSERT INTO foo VALUES (repeat('x', 9));
_
これを行う理由はいくつかありますが、
char(x)
は、スキーマローダーで固定幅の列であると推測される場合があります。これにより、固定幅文字列用に最適化された言語に違いが生じる可能性があります。私がこれを行う場所の例が必要です、
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
と対比さらに、上記の提案はalmostは常にtext
を使用するという慣例に非常に適していると思います。あなたはvarchar(n)
についても尋ねます。 私はそれを使用しません。少なくとも、最後にvarchar(n)
を使用したときのことは思い出せません。
char(n)
を使用します。text
(制限なし)であるvarchar
を使用します意味のある可変長のテキストキーがあり、最大長が一定であると信頼できる仕様を見つけた場合は、varchar(n)
も使用します。しかし、私はその基準に合うものは何も考えられません。
char
ここでは、_"char"
_ と混同しないでください。これは1バイトタイプであり、確かなパフォーマンスとスペース節約の利点があります。関連するQ&A:
Postgresql
sales_reporting_db=# create table x (y char(2));
CREATE TABLE
sales_reporting_db=# insert into x values ('Y');
INSERT 0 1
sales_reporting_db=# select '*' || y || '*' from x;
?column?
----------
*Y*
オラクル
SQL> create table x ( y char(2));
Table created.
SQL> insert into x values ('Y');
1 row created.
SQL> select '*' || y || '*' from x;
'*'|
----
*Y *
Postgresqlはスペースを埋めませんでした。