在 Firebird 存储过程中,如何将非 UTF 文本插入 UTF 字段?
In Firebird stored procedure how do I insert non UTF text into a UTF field?
在我的存储过程中,我正在这样做;
declare variable my_text varchar(512);
...
select non_utf_notes from table1 where unique_field = :some_value
into :my_text;
....
insert into table2(unique_field, utf_text)
values(:some_value, :my_text);
表1没有定义字符集,表2定义了UTF8字符集
如果您没有在数据库中明确设置默认字符集(或者相关字段是在设置默认值之前创建的),则 (VAR)CHAR 字段具有字符集 NONE
,除非您明确指定了字段的字符集。
字符集 NONE
有点烦人(尽管它可能很强大),因为它本质上是二进制数据。缺少特定的真实字符集意味着在转换为真实字符集时,将在该字符集中处理字节。这对于大多数字符集来说都很好(尽管您可能会得到错误的字符),但是 UTF-8 具有可变长度编码,其中某些字节组合是无效的。
要处理从 NONE
到 UTF8
的转换,您需要确保 NONE
中的数据确实是 UTF-8,或者您首先需要转换为'right' 字符集(例如 WIN1252
),然后转换为 UTF8
,因为这将执行正确的编码。
在我的存储过程中,我正在这样做;
declare variable my_text varchar(512);
...
select non_utf_notes from table1 where unique_field = :some_value
into :my_text;
....
insert into table2(unique_field, utf_text)
values(:some_value, :my_text);
表1没有定义字符集,表2定义了UTF8字符集
如果您没有在数据库中明确设置默认字符集(或者相关字段是在设置默认值之前创建的),则 (VAR)CHAR 字段具有字符集 NONE
,除非您明确指定了字段的字符集。
字符集 NONE
有点烦人(尽管它可能很强大),因为它本质上是二进制数据。缺少特定的真实字符集意味着在转换为真实字符集时,将在该字符集中处理字节。这对于大多数字符集来说都很好(尽管您可能会得到错误的字符),但是 UTF-8 具有可变长度编码,其中某些字节组合是无效的。
要处理从 NONE
到 UTF8
的转换,您需要确保 NONE
中的数据确实是 UTF-8,或者您首先需要转换为'right' 字符集(例如 WIN1252
),然后转换为 UTF8
,因为这将执行正确的编码。