10. Но русских только 4 (два байта на букву + байт на селектор страницы).

Так тогда получается что в скобках идёт количество байт, а не количество символов. Так а почему тогда я не могу объявить поле VARCHAR(32700) ?

В скобках идет максимальное количество символов. Firebird потом умножает макс. количество байт на символ на макс. количество символов и смотрит, влезет то, что получилось в макс. размер VARCHAR в байтах.

Никто не мешает тебе объявить столбец как VARCHAR(32000) CHARACTER SET ASCII, но тогда в него другие буквы не полезут. А ежели хочешь в тот же столбец и английские и русские буквы пихать (а потом еще и китайские), тогда придется жить с тем ограничением.

VARCHAR(8000), 32000 английских/немецких ты туда запихнешь, но вот русских только около 16.000. При чем если компоненты шибко умные (например старые версии Jaybird), то больше 8.000 могут и не дать записать.

А почему тогда это обламывается с ошибкой "бла бла бла, string truncation"

EXECUTE BLOCK
RETURNS (
  STR VARCHAR(3) CHARACTER SET UTF8 )
AS
BEGIN
  STR = 'abcde';
  SUSPEND;
END

Хм... Все, что я раньше говорил работает для UNICODE_FSS. Для UTF8 - нет. Как оказалось, там проверка на количество символов, не байт.

EXECUTE BLOCK
RETURNS (
  STR VARCHAR(3) CHARACTER SET UNICODE_FSS)
AS
BEGIN
  STR = 'abcde';
  SUSPEND;
END

Пардон.

Роман

Ответить