我正在将firebird数据库中的所有varchar列更改为UTF8但是我不理解varchar大小的差异。
例如,如果将charset和collation设置为nothing,我们可以将varchar大小设置为255,如果我们将charset和collation设置为UTF8,当我们将varchar设置为255时,它会读取不同的值。
UTF8中varchar(255)的等效varchar大小是多少?
答案 0 :(得分:7)
对VARCHAR(N)
字段使用UTF8字符集需要为任何N
UTF8字符保留足够的空间。一个这样的字符的长度可以在1到4之间,所以唯一安全的是允许每个长度为4的N
个字符,这意味着需要有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。
所以回答你的问题:要有一个空格为255个字符的UTF8列,你输入它为VARCHAR(255)
,但在数据库中它的大小为1020字节。