在 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 具有可变长度编码,其中某些字节组合是无效的。

要处理从 NONEUTF8 的转换,您需要确保 NONE 中的数据确实是 UTF-8,或者您首先需要转换为'right' 字符集(例如 WIN1252),然后转换为 UTF8,因为这将执行正确的编码。