Firebird - размер UTF8 VarChar

Я меняю все столбцы varchar в нашей базе данных firebird на UTF8, но не понимаю разницы в размере varchar.

Например, если для набора символов и сопоставления установлено значение «Ничего», мы можем установить размер varchar на 255, если мы установим набор символов и сопоставление на UTF8, когда мы установим varchar на 255, он будет читать разные значения.

Каким будет эквивалентный размер varchar для varchar (255) в UTF8?


person Community    schedule 05.05.2009    source источник
comment
Что вы имеете в виду, что он читает разные значения?   -  person Douglas Tosi    schedule 05.05.2009


Ответы (1)


При использовании набора символов UTF8 для полей VARCHAR(N) необходимо зарезервировать достаточно места для любых символов N UTF8. Длина одного такого символа может составлять от 1 до 4, поэтому единственное безопасное решение - разрешить N символов длиной 4 каждый, то есть должно быть место для 200 байтов для хранения 50 символов (наихудший случай).

Вы можете использовать инструмент FlameRobin, чтобы взглянуть на внутреннее устройство. Предположим, у вас есть таблица

CREATE TABLE "TableÅÄÖåäö"
(
  "ColÅÄÖåäö" Varchar(50)
);

в базе данных с набором символов по умолчанию UTF8. (Обратите внимание, что для этого вам понадобится как минимум Firebird 2.0.)

В системных таблицах хранится информация обо всех отношениях и их полях. В системной таблице RDB$RELATION_FIELDS есть запись для этого поля, которое имеет (например) RDB$1 как RDB$FIELD_SOURCE. В RDB$FIELDS есть одна запись для RDB$1, и ее значение RDB$FIELD_LENGTH равно 200.

Итак, чтобы ответить на ваш вопрос: чтобы иметь столбец UTF8 с пространством для 255 символов, вы вводите его как VARCHAR(255), но в базе данных он будет иметь размер 1020 байт.

person mghie    schedule 05.05.2009
comment
Почему размер 1220 байт? Должно быть 255 * 4 = 1020 байт? - person TomCat500; 09.10.2017
comment
@ TomCat500: Вы, конечно, правы, опечатка. Спасибо за подсказку, исправил. - person mghie; 09.10.2017