VARCHARとCHARの違いは何ですか?


366

MySQLのVARCHARとCHARの違いは何ですか?

MD5ハッシュを保存しようとしています。


15
MD5ハッシュは常に32文字です。したがって、CHARは固定長であるため、パフォーマンスを最大化するにはCHAR(32)を使用します(CHARとVARCHARの違いの詳細については、以下の回答を参照してください)。
オーガスティン

回答:


361

VARCHAR 可変長です。

CHAR 固定長です。

コンテンツが固定サイズの場合、次の方法でパフォーマンスが向上します CHARます。

詳細な説明は、CHARおよびVARCHARタイプのMySQLページを参照してください(コメントも必ずお読みください)。


51
@steven:Anonのとき。「コンテンツは固定サイズです」とは、テーブルの行にすべての固定サイズフィールドが含まれている必要があることを意味します。1つのフィールドでVARCHARに対してCHARを使用してもパフォーマンスは向上しませんが、テーブルにはVARCHARである他のフィールドが含まれています。
Marco Demaio、

2
charデータ型ではパフォーマンスが向上しません...クエリsqlを実行すると実行プランが生成されます。charcol char(2000)とVarcharCol Varchar(2000)の2つの列があると想定します。実行計画では、varcharタイプの列の推定行サイズは、推定未満である可能性があります。したがって、それは流出をtemp dbに導きます。したがって、charを使用するとパフォーマンスが向上します
vignesh '10 / 10/9

1
VARCHAR(n)の括弧内の値の意味は何ですか?
シバガミナンビ2017

@マルコ・デマイオ、その理由を知っていますか?
Dehan de Croos 2017

1
@ jdc91:パフォーマンスを向上させるには、行全体を固定幅にする必要があります。MySQLは、そのようなテーブルの行のスペース要件とオフセットを計算する利点を獲得します。
Marco Demaio 2017年

225

チャー

  1. 固定長の文字列値を格納するために使用されます。
  2. 最大なし。データ型が保持できる文字数255文字です。
  3. それはだ50%高速化 VARCHARより。
  4. 静的メモリ割り当てを使用します

VARCHAR

  1. 可変長を格納するために使用されます英数字データます。
  2. このデータ型が保持できる最大値は最大
    • MySQLより前のバージョン5.0.3:255文字
    • Post-MySQL 5.0.3:行で共有される65,535文字
  3. それはです遅く CHARより。
  4. 動的メモリ割り当てを使用します

3
この回答が非常に頻繁に賛成されていることに少し驚いています。MySQLのドキュメントには、Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.
DroidOS

2
英数字データもcharで格納できることは言うまでもありません
忍者

44
これに基づいて50%速いのは何ですか?何をするのに50%速い?どのような条件で?そして、このコンテキストでの静的メモリ割り当てと動的メモリとはどういう意味ですか?
マーティンスミス

4
@MartinSmith私は同じことを尋ねるつもりだった..情報が正確であるとは思わない。asktom.oracle.com/pls/asktom/...
Ozgurバー

2
-1; ここでのパフォーマンスの主張は曖昧で根拠のないものであり、メモリ割り当て戦略の違い(およびそれが重要である理由)は具体化されておらず、varcharが「英数字データ」を格納するという主張は少し奇妙です。varchar列には、英数字以外の文字も格納できます。
Mark Amery

122

CHARとVARCHAR

CHARは固定長サイズ変数に使用されます
使用されますVARCHARは使用されます。

例えば

Create table temp
(City CHAR(10),
Street VARCHAR(10));

Insert into temp
values('Pune','Oxford');

select length(city), length(street) from temp;

出力は

length(City)          Length(street)
10                    6

結論:可変長が可変の場合、記憶域を効率的に使用するには、CHARではなくVARCHARを使用する必要があります。


4
City = char(10)、Street = varchar(10)、city = Pune、street = Oxford、length(city)= 4、length(street)= 6
abdulwadood

2
このクエリ(select length(city)、length(street)from temp))は、mysql 5.7で次の出力を提供しますmysql> select length(city)、length(street)from temp; + -------------- + ---------------- + | 長さ(都市)| 長さ(通り)| + -------------- + ---------------- + | 4 | 6 | + -------------- + ---------------- +セットの1行(0.00秒)
Jasbeer Rawal 2017

69

CHAR(x)列しか持つことができ、正確に x文字を。列は持つことができるまでの文字。
VARCHAR(x) x

MD5ハッシュは常に同じサイズになるため、おそらくを使用する必要がありますCHAR

ただし、最初にMD5を使用するべきではありません。既知の弱点があります。
代わりにSHA2を使用してください。
パスワードをハッシュする場合は、bcryptを使用する必要があります。


44
「CHAR(x)列には、正確にx文字しか含めることができません。」実際には、x文字未満のデータを追加できますが、バックグラウンドで常に10文字相当のメモリを予約することを意図していたと思います。
Dan W

13
なぜそれらがmd5ハッシュを格納しているのかはわかりません。md5を使用する正当な理由は数多くあり、セキュリティとは関係ありません。衝突はまったく一般的ではなく、アルゴリズムはより安全なものよりも高速です。
ジョンハント

1
CHAR(x)列がx文字を正確に強制しないと仮定すると、固定サイズのデータ​​でもVARCHAR(x)よりも使用する理由はありますか?
NeverEndingQueue 2018年

11

MySQLのVARCHARとCHARの違いは何ですか?

すでに回答がありましたが、OLTPシステムまたは頻繁に更新されるシステムでは、更新中に列の断片化CHARが発生する可能性があるため、可変サイズの列でも使用することを検討してVARCHARください。

MD5ハッシュを保存しようとしています。

セキュリティが本当に重要な場合、MD5ハッシュは最良の選択ではありません。ただし、ハッシュ関数を使用する場合BINARYは、代わりにタイプを検討してください(たとえば、MD5は16バイトのハッシュを生成するため、16 進数を表す32文字BINARY(16)CHAR(32)はなく十分です。これにより、より多くのスペースが節約され、パフォーマンスが効果的になります。


この一連の考えに従って、可読性と効率性を目的としたビジネスIDにCHARを使用します。ただし、bigintの主キーは引き続き使用します。
アルキメデストラハノ2015

9

入力された文字が宣言された長さより短い場合、Varcharは末尾のスペースを切り捨てますが、charはそうではありません。Charはスペースを埋め、常に宣言された長さになります。効率の面では、varcharは文字をトリミングしてより多くの調整ができるため、より優れています。ただし、charの正確な長さがわかっている場合、charはもう少し高速で実行されます。


7

今日のほとんどのRDBMSでは、それらは同義語です。ただし、まだ区別があるシステムの場合、CHARフィールドは固定幅の列として格納されます。CHAR(10)と定義すると、10文字がテーブルに書き込まれ、「パディング」(通常はスペース)を使用して、データが使用しないスペースを埋めます。たとえば、「bob」を保存すると、(「bob」+7スペース)として保存されます。VARCHAR(可変文字)列は、CHAR列が行う余分なスペースを無駄にすることなくデータを格納するためのものです。

いつものように、ウィキペディアは大声で話します。


5

CHARは固定長フィールドです。VARCHARは可変長フィールドです。名前などの非常に可変的な長さの文字列を格納する場合は、VARCHARを使用します。長さが常に同じ場合は、CHARを使用します。これは、サイズ効率がやや高く、わずかに高速であるためです。


私は思いますが推測ここではスピードとストレージの効率性に関する主張は、真であるどちらもそれらのは、どのような方法で実証されていないこと(そして、それは完全にもっともらしいですその彼らしている偽)この答えは非便利になり、。それは、読者がおそらく真実であると期待していたであろうことを繰り返すだけであり、本当にそれを確認するのに役立つことは何もしません。
Mark Amery

1

CHARは固定長で、VARCHARは可変長です。CHARは常にエントリごとに同じ量のストレージ領域を使用しますが、VARCHARは実際のテキストを格納するために必要な量のみを使用します。


1

charは固定長文字データ型であり、varcharは可変長文字データ型です。

charは固定長のデータ型であるため、char値の格納サイズはこの列の最大サイズと同じです。varcharは可変長データ型であるため、varchar値のストレージサイズは、入力されたデータの実際の長さであり、この列の最大サイズではありません。

列のデータエントリが同じサイズであると予想される場合は、charを使用できます。列のデータエントリのサイズが大幅に変化すると予想される場合は、varcharを使用できます。


0

High Performance MySQLの本によると:

VARCHARは可変長文字列を格納し、最も一般的な文字列データ型です。必要なスペースのみを使用するため(つまり、短い値を格納するために使用されるスペースが少ないため)、固定長タイプよりも少ないストレージスペースで済みます。例外は、ROW_FORMAT = FIXEDで作成されたMyISAMテーブルです。これは、各行に対してディスク上の固定量のスペースを使用するため、スペースを浪費する可能性があります。VARCHARは スペースを節約するためパフォーマンスに役立ちます

CHARは固定長です。MySQLは常に、指定された文字数に対して十分なスペースを割り当てます。CHAR値を保存する場合、MySQLは末尾のスペースを削除します。(これは、MySQL 4.1以前のバージョンのVARCHARにも当てはまります。CHARとVAR CHARは論理的に同一であり、格納形式のみが異なります。)比較のために、必要に応じて値にスペースが埋め込まれます。


2
VARCHARはスペースを節約するのでパフォーマンスを向上させます」それはスペースを節約します、はい、しかしそれはパフォーマンスに悪影響を与えませんか?VARCHAR必要に応じて動的にメモリを割り当てる必要があるため、とは対照的にパフォーマンスが低下しCHARます。
Spikatrix

@Spikatrixに依存します。多くの場合、VARCHAR値は小さいが最大Nバイトになる可能性がある場合、動的割り振りにより、大量のスペースとI / Oを節約できます。これは、大量のデータに対してよりパフォーマンスが高くなります。長さがほぼ等しいCHAR値の方がパフォーマンスが高くなります。読み取りと書き込みの違いもおそらく違います。
Andrew

-4

Char 固定長(2000文字をサポート)であり、文字がデータ型であることを表します

Varchar 可変長(4000文字をサポート)


-1; これらの数値はMySQLでは正しくありません。(私はそれらがOracleのためかもしれないと思いますか?)
マーク・アメリー

-5

Charまたはvarchar-大括弧で長さを示すことができるテキストデータを入力するために使用されます。例:char(20)


これは元の質問には対応していません。OPは、型の構文や目的ではなく、型間の実用的な違いを求めています。また()かっこではなく、かっこです。
2mac 2015

@ 2mac最後の文はアメリカ英語にのみ当てはまります。イギリスでは、我々は呼び出す()、ブラケット、および多くの英国人は、おそらく言葉「かっこ」は句読点を参照することが可能な英語の方言があることに気付いていません。「括弧」よりも「括弧」を好む場合には強いケースがあります。これは、おそらく、国際的なプログラマーを対象とする場合の最も明確なオプションです。
Mark Amery 2017

-11

CHAR:

  • 文字と数字の両方をサポートします。
  • 2000文字をサポートします。
  • 固定長。

VARCHAR:

  • 文字と数字の両方をサポートします。
  • 4000文字をサポートします。
  • 可変長。

コメント...... !!!!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.