1. ホーム
  2. sql

[解決済み】SQLでVARCHARよりCHARを選択するユースケースは何ですか?

2022-04-16 01:22:58

質問

すべての値が固定幅の場合、CHARが推奨されることは承知しています。しかし、だから何ですか?安全のために、すべてのテキストフィールドにVARCHARを選択してはいかがでしょうか。

どのように解決するのですか?

一般的なルールは、以下の通りです。 CHAR に近い値を持つ行がある場合、その行は 同じ長さ . ピック VARCHAR (または NVARCHAR を指定した場合 長さが異なる を大幅に削減することができます。 CHARはまた、すべての行が同じ長さであるため、少し速くなることがあります。

DBの実装によって異なりますが、一般的にはVARCHAR(または NVARCHAR ) は、実際のデータに加えて、(長さや終端のために)さらに1〜2バイトのストレージを使用します。 つまり、(1バイト文字セットを使用していると仮定して)"FooBar"という単語を格納することになります。

  • CHAR(6) = 6バイト (オーバーヘッドなし)
  • VARCHAR(100) = 8バイト (2バイトのオーバーヘッド)
  • CHAR(10) = 10バイト (4バイトの無駄)

一番下の行は CHAR である より速く そして、より スペース効率 比較的同じ長さのデータ(2文字以内の長さの差)の場合。

備考 : Microsoft SQLでは、VARCHARに対して2バイトのオーバーヘッドがあります。これはDBによって異なるかもしれませんが、一般的にVARCHARの長さやEOLを示すために少なくとも1バイトのオーバーヘッドが必要です。

で指摘されたように ゲイブン をコメントで紹介しました。になると、状況が変わってきます。 マルチバイト文字 セットで、VARCHAR がより良い選択となるケースです。

の宣言長についての注意点です。 VARCHAR : 実際のコンテンツの長さを保存するので、未使用の長さを無駄にすることはありません。つまり、6文字を varchar(6)、varchar(100)です。 または VARCHAR(MAX) は同じ量のストレージを使用します。を使用する場合の違いについて、詳しくはこちらをご覧ください。 VARCHAR(MAX) . を宣言します。 最大 のサイズをVARCHARで指定し、保存する量を制限します。

コメントで いつでも学習 が指摘されています。 Microsoft Transact-SQL docs は、逆のことを言っているように見えます。これは誤りであるか、少なくともドキュメントが不明瞭であることを示唆しています。