VARCHAR не работает должным образом в Apache Derby

У меня эта же проблема:

Как я могу АВТОМАТИЧЕСКИ обрезать VARCHAR до длины поля таблицы в Derby с помощью SQL?

Чтобы быть конкретным:

СОЗДАТЬ ТАБЛИЦУ A ( B VARCHAR(2) ); ВСТАВИТЬ В ЗНАЧЕНИЯ B ('1234'); вызовет исключение SQLException:

Произошла ошибка усечения при попытке уменьшить VARCHAR '123' до длины 2.

на который уже ответили:

Нет. Вы должны отрубить его после проверки метаданных. Или, если вы не хотите каждый раз проверять метаданные, вы должны синхронизировать свой код и базу данных. Но это не страшно, это обычная практика в валидаторах.

но я сомневаюсь: разве VARCHAR не должен изменять свой размер, чтобы соответствовать данным? Что не так с VARCHAR в apache derby?


person The Student    schedule 18.05.2010    source источник


Ответы (2)


Тип VARCHAR имеет переменную длину, но число, которое вы указываете в его определении, является максимальным количеством символов, которое вы ему позволяете.

VARCHAR(2) будет хранить значения, состоящие из 0-2 символов, в отличие от CHAR(2), который будет хранить 2 символа независимо от того, какие данные у него есть на самом деле.

Боковое примечание: как только вы дойдете до 255 символов, рассмотрите возможность использования вместо этого типа TEXT.

person Powerlord    schedule 18.05.2010
comment
Согласно документам Derby, он не поддерживает тип TEXT, но, возможно, LONG VARCHAR имело бы смысл. Мысли? - person Matt Passell; 24.02.2011

Нет, то, что вы описываете, не имеет к этому никакого отношения: varchar не будет дополняться пробелами, char будет дополняться пробелами.

так что если у вас есть

CREATE TABLE A ( B VARCHAR(20) ); INSERT INTO A B VALUES ('1234')

он будет использовать 4 байта, а не 20 байтов, однако вы не можете поместить в этот столбец более 20 символов, либо проверьте перед вставкой, либо используйте что-то вроде функции LEFT (val, 2)

Но опять же, вы бы не хотели знать, что ваши данные не подходят и усекаются. В конце концов, самое главное - это ваши данные... если ваши данные ошибочны, у вас ничего нет.

В SQL Server есть параметр, который вы можете использовать, и он сделает это за вас, см. Подавлять строковые или двоичные данные будут усеченными сообщениями с настройкой ANSI WARNINGS

В основном вам нужно SET ANSI_WARNINGS OFF, но я не знаю, работает ли это с вашей БД

person SQLMenace    schedule 18.05.2010