textデータ型と
character varying(
varchar`)データ型の違いは何ですか?
ドキュメント]1によると
文字の長さを指定せずにcharacter varyingを使用した場合、このデータ型は任意のサイズの文字列を受け入れます。後者はPostgreSQLの拡張機能です。
そして
さらに、PostgreSQLは任意の長さの文字列を格納するtext型を提供しています。text型は標準SQLには含まれていませんが、他のいくつかのSQLデータベース管理システムも同様に持っています。
では、何が違うのでしょうか?
違いはありません。ボンネットの中ではすべてvarlena
(可変長配列)なのです。
Depeszのこの記事をチェックしてください: http://www.depesz.com/index.php/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/
いくつかのハイライトを紹介します。
すべてを要約すると
- char(n) -
n
よりも短い値を扱うときにスペースを取りすぎてしまう(n
にパッドする)し、末尾にスペースを追加するために微妙なエラーを引き起こす可能性がある。 さらに、制限値を変更するには問題があります。- varchar(n) - 本番環境で制限値を変更するのは問題があります(テーブル変更時に排他的ロックが必要)。
- varchar - テキストと同様です。
- text - 私にとっての勝者 - (n)データ型の問題点がないので、(n)データ型に勝り、varchar - 固有の名前を持つので、varcharに勝る。
この記事では、詳細なテストを行い、4つのデータ型の挿入と選択のパフォーマンスが類似していることを示しています。また、必要に応じて長さを制約する別の方法についても詳しく見ています。関数ベースの制約やドメインは、長さの制約をすぐに増やすことができるという利点がありますが、文字列の長さの制約を減らすことはまれであることを踏まえて、depesz氏は、通常、長さの制限にはいずれかの方法が最適であると結論づけています。
ドキュメントの "Character Types" にあるように、varchar(n)
, char(n)
, text
はすべて同じように格納されます。唯一の違いは、長さが指定されている場合にはその長さをチェックするために余分なサイクルが必要になることと、char(n)
でパディングが必要な場合には余分なスペースと時間が必要になることです。
しかし、1文字だけを格納する必要がある場合には、特別な型である"char"
(ダブルクオートのままにしておいてください、これは型名の一部です)を使用することで、わずかながらパフォーマンス上の利点があります。フィールドへのアクセスが速くなり、長さを格納するためのオーバーヘッドもありません。
小文字のアルファベットから選ばれた1,000,000個のランダムな"char"
のテーブルを作ってみました。度数分布を得るためのクエリ(select count(*), field ... group by field
)の所要時間は約650ミリ秒ですが、同じデータでtext
フィールドを使用した場合は約760ミリ秒です。
PostgreSQLのマニュアルについて
これら3つのタイプの間に性能上の違いはありませんが、blank-paddedタイプを使用した場合にストレージ容量が増加することと、長さに制約のある列に格納する際に長さをチェックするためにCPUサイクルが少し増えることを除けば、性能上の違いはありません。他のデータベースシステムではcharacter(n)には性能上の利点がありますが、PostgreSQLではそのような利点はありません。 実際、character(n)はストレージコストがかかるため、通常3つの型の中で最も遅くなります。ほとんどの状況では、textやcharacterの変化を代わりに使用すべきです。
私は通常、テキスト
参考: http://www.postgresql.org/docs/current/static/datatype-character.html