如何在 Firebird 中将字符集从 ISO8859_1 转换为 UTF8?
How to convert character set from ISO8859_1 to UTF8 in Firebird?
我在 Firebird 2.5 中有一个数据库,里面装满了数据。
我需要将字符集从 UTF-8
更改为 ISO8859_1
,我试过:
alter database default character set ISO8859_1 collation ES_ES
但是没用。如何转换字符集?
ALTER CHARACTER SET ISO8859_1
SET default COLLATION ES_ES;
脚本 - 对您要更改的活动数据库执行此操作!
更改默认字符集仅影响更改后 created 的列(没有显式字符集)。现有列不受影响,因为字符集是每个单独列的 属性。这意味着您必须更改所有(相关)列。
有几个问题
- Firebird 不会在更改时间更改数据,而是创建一个新的格式版本,并在 select 时间从旧格式即时转换为新格式。
这会影响性能,但也会导致运行时出现字符串转换错误(例如,因为 ISO-8859-1 中不存在 UTF-8 字符)。
- 仅当列当前具有真实字符集(即
NONE
或 OCTETS
除外)时,更改字符集才能正常工作。
从 NONE
或 OCTETS
转换到另一个字符集可能会导致字符串转换错误,或垃圾,因为内容可能不符合您的预期,或者可能是目标字符集中的无效字节。
- 某些版本 - iirc - 实际上根本不更改字符集
要解决这些问题,您可以这样做:
- 导出数据库的 DDL,更改字符集定义,创建新数据库并使用数据泵工具(如 FBCopy)将数据从旧的复制到新的
- 或者,对于您要更改的每一列:
- 创建一个新列
UPDATE table SET newcolumn = oldcolumn
(或者如果旧列是 NONE
或 OCTETS
:UPDATE table SET newcolumn = cast(cast(oldcolumn as VARCHAR(...) CHARACTER SET assumedcharset) as VARCHAR(...) CHARACTER SET targetcharset)
- 删除旧列
- 重命名新列
- 修复任何其他依赖性问题(索引、触发器、外键等)
只有当你想更改一个小型数据库(在表、列和依赖项方面)或者你需要执行奇数转换时,第二个选项才是可取的,否则我强烈建议使用数据泵解决方案。
我在 Firebird 2.5 中有一个数据库,里面装满了数据。
我需要将字符集从 UTF-8
更改为 ISO8859_1
,我试过:
alter database default character set ISO8859_1 collation ES_ES
但是没用。如何转换字符集?
ALTER CHARACTER SET ISO8859_1
SET default COLLATION ES_ES;
脚本 - 对您要更改的活动数据库执行此操作!
更改默认字符集仅影响更改后 created 的列(没有显式字符集)。现有列不受影响,因为字符集是每个单独列的 属性。这意味着您必须更改所有(相关)列。
有几个问题
- Firebird 不会在更改时间更改数据,而是创建一个新的格式版本,并在 select 时间从旧格式即时转换为新格式。
这会影响性能,但也会导致运行时出现字符串转换错误(例如,因为 ISO-8859-1 中不存在 UTF-8 字符)。 - 仅当列当前具有真实字符集(即
NONE
或OCTETS
除外)时,更改字符集才能正常工作。 从NONE
或OCTETS
转换到另一个字符集可能会导致字符串转换错误,或垃圾,因为内容可能不符合您的预期,或者可能是目标字符集中的无效字节。 - 某些版本 - iirc - 实际上根本不更改字符集
要解决这些问题,您可以这样做:
- 导出数据库的 DDL,更改字符集定义,创建新数据库并使用数据泵工具(如 FBCopy)将数据从旧的复制到新的
- 或者,对于您要更改的每一列:
- 创建一个新列
UPDATE table SET newcolumn = oldcolumn
(或者如果旧列是NONE
或OCTETS
:UPDATE table SET newcolumn = cast(cast(oldcolumn as VARCHAR(...) CHARACTER SET assumedcharset) as VARCHAR(...) CHARACTER SET targetcharset)
- 删除旧列
- 重命名新列
- 修复任何其他依赖性问题(索引、触发器、外键等)
只有当你想更改一个小型数据库(在表、列和依赖项方面)或者你需要执行奇数转换时,第二个选项才是可取的,否则我强烈建议使用数据泵解决方案。