Firebird - UTF8 VarChar大小

5

我正在将我们的火鸟数据库中所有varchar列更改为UTF8,但我不明白varchar大小的区别。

例如,如果字符集和比对集设置为无,则可以将varchar大小设置为255,如果将字符集和比对集设置为UTF8,则当我们将varchar设置为255时,它会读取不同的值。

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


你是什么意思说“它读取了不同的值”? - Douglas Tosi
1个回答

8

对于VARCHAR(N)字段,使用UTF8字符集需要为任何N个UTF8字符预留足够的空间。一个这样的字符的长度可能在1到4之间,因此唯一安全的方法是允许每个长度为4的N个字符,这意味着需要为存储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。因此,回答您的问题:要拥有一个具有255个字符空间的UTF8列,您可以将其输入为VARCHAR(255),但在数据库中,其大小将为1020字节。

为什么大小是1220字节?它应该是255 * 4 = 1020字节吗? - TomCat500
@TomCat500:您当然是正确的,这是一个打字错误。感谢您的提示,我会修复它的。 - mghie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接