Informix列の最大長はどのくらいですか?それを増やすことができますか?
質問
次のテーブルを作成しようとしています:
CREATE TABLE GTW_WORKFLOW_MON
(
WORKFLOW_NAME VARCHAR(255) NOT NULL,
WORKFLOW_LOADED NUMERIC(20) NOT NULL,
ACTIVITY_NAME VARCHAR(255) NOT NULL,
FLAGS INTEGER NOT NULL,
MONITOR_NAME VARCHAR(255) NOT NULL,
CLASSNAME VARCHAR(255) NOT NULL,
STR0 VARCHAR(255),
STR1 VARCHAR(255),
STR2 VARCHAR(255),
NUM0 VARCHAR(255),
NUM1 VARCHAR(255),
NUM2 VARCHAR(255),
DATE0 VARCHAR(255),
DATE1 VARCHAR(255),
DATE2 VARCHAR(255),
PRIMARY KEY (WORKFLOW_NAME, WORKFLOW_LOADED, ACTIVITY_NAME, MONITOR_NAME)
)
列の長さが十分でないために失敗します。
解決
SQLステートメントが構文的に有効であり、正確なエラーメッセージを提供した場合に役立ちます。再フォーマットして構文を修正すると、ステートメントは次のようになります。
CREATE TABLE gtw_workflow_mon
(
workflow_name VARCHAR(255) NOT NULL,
workflow_loaded NUMERIC(20) NOT NULL,
activity_name VARCHAR(255) NOT NULL,
flags INTEGER NOT NULL,
monitor_name VARCHAR(255) NOT NULL,
classname VARCHAR(255) NOT NULL,
str0 VARCHAR(255),
str1 VARCHAR(255),
str2 VARCHAR(255),
num0 VARCHAR(255),
num1 VARCHAR(255),
num2 VARCHAR(255),
date0 VARCHAR(255),
date1 VARCHAR(255),
date2 VARCHAR(255),
PRIMARY KEY(workflow_name, workflow_loaded, activity_name, monitor_name)
);
また、2KBページのシステムで実行すると、エラーメッセージは次のようになります。
SQL -550: Total length of columns in constraint is too long.
エラーメッセージの簡単な説明を取得する標準的な方法は、 finderr
です。それは言う:
$ finderr -550
-550 Total length of columns in constraint is too long.
The total size of all the columns listed in a UNIQUE, PRIMARY KEY, or
FOREIGN KEY clause is limited. The limit depends on the database server
in use, but all servers support a total of 120 bytes. The limit is the
same as the restriction on the total size of all columns in a composite
index. For additional information, see the CREATE TABLE statement in
the IBM Informix Guide to SQL: Syntax.
$
「合計120バイト」は「合計120バイト以上」でなければなりません。その下限はInformix SEに適用されます。 IDS(Informix Dynamic Server)では、下限は255バイトですが、最近のシステムでは大きく、ページサイズが大きくなると大きくなります。
さまざまなオプションがあります。
- 名前がそれぞれ255文字である必要がある理由を考えることができます-それは理にかなっています(たとえば、64で十分でしょうか)
- サーバーのバージョンが十分に新しい場合(10.00以降、私は信じています)、より大きなページサイズでDB領域にテーブルを作成できます。
キーは最大3 * 255 +(20/2 + 1)= 776バイトであるため、経験則では、5つの最大長キー値+ ROWID / FRAGIDオーバーヘッドを保存できる必要があります( 1ページあたり8バイト)、4 KBのページサイズが必要です。 (AIXで実行していた場合、おそらくこの問題に気付かなかったでしょう。)
また、VARCHAR(255)に日付値を保存しないでください。 DATEまたはおそらくDATETIME YEAR TO DAY(日付のスペルの奇妙な方法-基本的な形式は異なりますが、プレーンなDATEには4ではなく5バイトを使用します)、またはDATETIME YEAR TO SECOND(面白い方法つづり(TIMESTAMP)、または...「num0、num1、num2」フィールドも疑わしい。数値を格納する場合は、NUMERICまたはDECIMALを使用します。ほとんどのIDSデータベースでDECIMAL(20)は20桁の浮動小数点10進数を意味します。
追加して編集:
そして、直接の質問に答えるために、VARCHAR列の長さは最大255バイトまでです。 LVARCHAR列は最大約32 KBです。 CHARカラムは最大32 KBです。 TEXTカラムは最大2 GBで、CLOBカラムはさらに大きくできます。行の合計長は約32 KBに制限されます(ただし、BYTE、TEXT、BLOB、およびCLOB列は、合計32 KBの固定サイズ記述子としてカウントされます-実際のデータは行の外部に格納されます)。私が公開していないバージョン依存性がいくつかあります-IDS 10.00以降を使用している場合、これは正確です。