SQL Server 2005では、このクエリ
select len(cast('the quick brown fox jumped over the lazy dog' as varchar))
指定された文字列にさらに文字がある間、長さとして30を返します。これがデフォルトのようです。なぜ32ではなく30で、他の2のべき乗ではないのですか?
[EDIT] varcharにキャストするときは常に長さを指定する必要があることを認識していますが、これは簡単なlet's-check-someクエリでした。質問は残っていますが、なぜ30ですか?
なぜvarcharの長さを指定しないのですか?すなわち:
SELECT CAST('the quick brown fox jumped over the lazy dog' AS VARCHAR(45))
理由が30である限り、これはそのタイプのSQL Serverのデフォルトの長さです。
charおよびvarchar(Transact-SQL) から:
データ定義または変数宣言ステートメントでnが指定されていない場合、デフォルトの長さは1です。CASTおよびCONVERT関数の使用時にnが指定されていない場合、デフォルトの長さは30です。
なぜ32ではなく30または2の累乗ではないのかという質問では、varchar(n)のストレージサイズはn + 2バイトです。彼らは何を見ましたか?
次に、いくつかのコメントを明確にします。指定されていない長さのvarcharフィールドのデフォルトの長さはn = 1です。このデータ型の変換のためにCASTまたはCONVERTが返すデフォルトの文字列の長さは30です。
非常にクールな質問!
30を選択した理由はわかりませんが、MicrosoftのSQL Serverの開発元であるSybase SQL Serverでも同じでした。 SQL標準にはないため、これらのRDBMSの特殊性のようです。他のサーバーの動作は異なります。
Microsoftは、SQL Server、AccessのJet DBエンジン、およびその他のいくつかの製品のCHARおよびVARCHARのデフォルトの長さとして30を選択しました。これは、名前またはアドレス列のデフォルトの長さが最初に30に設定された昔から発生しています。Informixのような他のDBは、CHARが20、VARCHARが255にデフォルト設定されます。
私の理論では、デフォルトの30文字の長さは、名前と住所の行に関する米国郵政公社の仕様に由来するものです。
変換/キャストのデフォルトサイズはメモリの割り当てとは関係がないため、デフォルト値(30)は2の累乗とは関係ありません。
30の理由については、これは基本的なデータを最初の30文字でカバーするようにこのデフォルト値を与えるMicrosoftのガイドラインです。 http://msdn.Microsoft.com/en-us/library/ms176089.aspx
変換/キャストプロセス中にいつでも長さを変更できますが
select len(cast('the quick brown fox jumped over the lazy dog' as varchar(max)))