Firebird - размер UTF8 VarChar - PullRequest
4 голосов
/ 05 мая 2009

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

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

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

1 Ответ

7 голосов
/ 05 мая 2009

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

Вы можете использовать инструмент 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 байт.

...