我正在将我们的 firebird 数据库中的所有 varchar 列更改为 UTF8,但是我不明白 varchar 大小的差异。
例如,将 charset 和 collation 设置为空,我们可以将 varchar 大小设置为 255,如果我们将 charset 和 collation 设置为 UTF8,当我们将 varchar 设置为 255 时,它会读取不同的值。
UTF8 中 varchar(255) 的等效 varchar 大小是多少?
为字段使用 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 字节。