5

我正在将我们的 firebird 数据库中的所有 varchar 列更改为 UTF8,但是我不明白 varchar 大小的差异。

例如,将 charset 和 collat​​ion 设置为空,我们可以将 varchar 大小设置为 255,如果我们将 charset 和 collat​​ion 设置为 UTF8,当我们将 varchar 设置为 255 时,它会读取不同的值。

UTF8 中 varchar(255) 的等效 varchar 大小是多少?

4

1 回答 1

8

为字段使用 UTF8 字符集VARCHAR(N)需要为任何NUTF8 字符保留足够的空间。一个这样的字符的长度可能在 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_LENGTH200。

因此,回答您的问题:要拥有一个 UTF8 列,其中包含 255 个字符的空间,您将其输入为VARCHAR(255),但在数据库中它的大小为 1020 字节。

于 2009-05-05T08:06:37.477 回答