努力したWiki

推敲の足りないメモ書き多数

ユーザ用ツール

サイト用ツール


documents:database:sql-0003

SQLServer2005のレコード長

2009年06月16日 09時54分41秒

CHAR型の限界

 1> create table t1 (
 2>   a char(8000)
 3>  ,b char(61)
 4> );
 5> go
 メッセージ 1701、レベル 16、状態 1、サーバー GUNTRA、行 1
 7 バイトの内部オーバーヘッドを含めて、最小行サイズが 8068 になるので、テーブル 't1' を作成または変更できませんでした。こ
 のサイズは、テーブル行の最大許容サイズの 8060 バイトを超えています。
 1> create table t1 (
 2>   a char(8000)
 3>  ,b char(60)
 4> );
 5> go
 メッセージ 1701、レベル 16、状態 1、サーバー GUNTRA、行 1
 7 バイトの内部オーバーヘッドを含めて、最小行サイズが 8067 になるので、テーブル 't1' を作成または変更できませんでした。こ
 のサイズは、テーブル行の最大許容サイズの 8060 バイトを超えています。
 1> create table t1 (
 2>   a char(8000)
 3>  ,b char(54)
 4> );
 5> go
 メッセージ 1701、レベル 16、状態 1、サーバー GUNTRA、行 1
 7 バイトの内部オーバーヘッドを含めて、最小行サイズが 8061 になるので、テーブル 't1' を作成または変更できませんでした。こ
 のサイズは、テーブル行の最大許容サイズの 8060 バイトを超えています。
 1> create table t1 (
 2>    a char(8000)
 3>   ,b char(53)
 4> );
 5> go
 1> drop table t1;
 2> go
 1>

1レコードは 8060バイト 8053バイトらしい。

VARCHAR型の自由度

 1> create table t2 (
 2>   a varchar(8000)
 3>  ,b varchar(61)
 4> );
 5> go
 1> insert into t2 values(space(8000), space(61));
 2> go
 (1 行処理されました)
 1>

でもVARCHAR型で定義するなら大丈夫。きっちりレコードのINSERTもできたっぽい。

SQLServer2005のレコード長制限の突破

 1> create table t3 (
 2>   a varchar(8000)
 3>  ,b varchar(8000)
 4>  ,c varchar(8000)
 5> );
 6> go
 1> insert into t3 values(space(8000), space(8000), space(8000));
 2> go
 (1 行処理されました)
 1>

合計で 8000×3=24000バイトなのですが、あらら、INSERT出来たみたいです。 でも、項目の最大長は8000バイトですので、24000バイトの指定はエラーになります。

 1> create table t4 (
 2>   a varchar(24000)
 3> );
 4> go
 メッセージ 131、レベル 15、状態 2、サーバー GUNTRA、行 2
 列 'a' に指定したサイズ (24000) は、どのデータ型の許容最大サイズ (8000) も超えています。
 1> create table t4 (
 2>   a varchar(max)
 3> );
 4> go
 1> insert into t4 values(space(48000));
 2> go
 (1 行処理されました)
 1>

しかし、長さ指定で “max” を使うと、その指定をした項目は2GBまで扱えます。

  • 結局何バイト(何文字か?)が正しいのやら。説明がめんどくさいです。 - 努力中の人 (2006年12月07日 18時01分07秒)
documents/database/sql-0003.txt · 最終更新: 2015/12/23 09:59 by k896951

ページ用ツール