我通过谷歌做了一些研究,但找不到正确的答案。
我有一个 Firebird 数据库,我总是使用自己的域作为我的表字段。所有这些域都是用字符集 ISO8859_1 定义的。现在我想把它改成UTF8。
如果我在 IBExpert 中尝试此操作,它会给我带来以下代码:
ALTER DOMAIN D_CHAR100 TYPE VARCHAR(100) CHARACTER SET UTF8;
此更新有效。但它真的有效吗?所有字符都正确转换了吗,我现在是否已将我的字段更改为“真正的”UTF8??还是在内部保留为 ISO08859_1?
如果我在网上搜索,有人说:
和其他人说:
什么是对的?什么可能出错?我们有很多客户,我想通过脚本转换数据库。
最佳答案
更改字段不会更改该字段内的任何数据。它将为您暴露许多问题。执行此操作的最佳方法是复制数据,但是您还有更多工作要做。
以下是您将遇到的一些问题:
试试这两个语句:
select cast('½' as varchar(10) character set ISO8859_1)
from rdb$database
select cast('½' as varchar(10) character set UTF8)
from rdb$database
第一个有效,第二个无效。
最后,简单地更改字段将暴露上述四个问题,但是直到遇到它们你才会知道它们存在,在复杂的数据库中可能直到生产级用户遇到它们才知道它们存在。同时复制数据将为您自己带来更多的工作,但将使您能够正确处理上述所有项目。
还有两点需要注意:
关于utf-8 - 将 Firebird 字段/域从 ISO8859_1 转换为 UTF8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22632768/