Какова максимальная длина столбца 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)
);
И когда это запускается в системе со страницами размером 2 КБ, появляется сообщение об ошибке:
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 или новее), вы можете создать таблицу в пространстве баз данных с большим размером страницы.
Поскольку ключ имеет максимальную длину 3*255+(20/2+1) = 776 байт, и практическое правило заключается в том, что вам необходимо иметь возможность хранить 5 значений ключа максимальной длины + служебные данные ROWID/FRAGID (8 байтов). на страницу вам потребуется размер страницы 4 КБ.(Если бы вы работали на AIX, вы, вероятно, не заметили бы эту проблему.)
Кроме того, вам не следует хранить значения дат в VARCHAR(255);вам следует использовать DATE или, возможно, DATETIME YEAR TO DAY (странный способ написания DATE - хотя базовый формат другой, используя 5 байтов на диске вместо 4 для простой DATE) или, возможно, DATETIME YEAR TO SECOND (забавный способ написание TIMESTAMP), или...Поля «num0, num1, num2» также сомнительны;если они предназначены для хранения чисел, используйте NUMERIC или DECIMAL. DECIMAL(20) в большинстве баз данных IDS означает 20-значное десятичное число с плавающей запятой.
Отредактировано, чтобы добавить:
И, отвечая на прямой вопрос, столбцы VARCHAR могут иметь длину не более 255 байт;Столбцы LVARCHAR могут иметь размер примерно до 32 КБ;Столбцы CHAR могут иметь размер до 32 КБ;Столбцы TEXT могут иметь размер до 2 ГБ, а столбцы CLOB могут быть еще больше.Общая длина строки ограничена примерно 32 КБ (но столбцы BYTE, TEXT, BLOB и CLOB считаются дескриптором фиксированного размера по отношению к общей сумме в 32 КБ - фактические данные хранятся вне строки).Есть некоторые зависимости от версий, о которых я не говорю — если вы используете IDS 10.00 или более позднюю версию, это верно.