将字符集从ISO8859_1转换为UTF8

时间:2015-08-27 12:26:38

标签: database character firebird collation

我在firebird 2.5中有一个数据库填充数据。 我需要将字符集从UTF-8更改为ISO8859_1,我试过:

 alter database default character set ISO8859_1 collation ES_ES

但它不起作用。谢谢你的帮助!

2 个答案:

答案 0 :(得分:11)

更改默认字符集仅会影响更改后的已创建列(没有明确的字符集)。现有列不受影响,因为字符集是每个列的属性。这意味着您必须更改所有(相关)列。

有几个问题

  1. Firebird不会在更改时更改数据,而是创建新的格式版本,并在选择时将旧格式转换为新格式。
    这会对性能产生影响,但也会在运行时导致字符串转换错误(例如,因为ISO-8859-1中不存在UTF-8字符)。
  2. 如果列当前具有真实字符集(即NONEOCTETS除外),则仅更改字符集才能正常工作。 从NONEOCTETS转换为另一个字符集可能会导致字符串转换错误或垃圾,因为内容可能与您的预期不符,或者目标字符集中的字节可能无效。
  3. 某些版本 - iirc - 实际上并没有改变字符集
  4. 要解决这些问题,您可以这样做:

    1. 导出数据库的DDL,更改字符集定义,创建新数据库并使用数据泵工具(如FBCopy)将数据从旧数据复制到新数据
    2. 或者,对于您要更改的每列:
      • 创建新列
      • UPDATE table SET newcolumn = oldcolumn(或者如果旧列为NONEOCTETSUPDATE table SET newcolumn = cast(cast(oldcolumn as VARCHAR(...) CHARACTER SET assumedcharset) as VARCHAR(...) CHARACTER SET targetcharset)
      • 删除旧列
      • 重命名新列
      • 修复任何其他依赖性问题(索引,触发器,外键等)
    3. 如果您想要更改小型数据库(就表,列和依赖项而言)或者您需要执行奇怪的转换,则第二个选项更可取,否则我强烈建议使用数据泵解决方案。

答案 1 :(得分:0)

ALTER CHARACTER SET ISO8859_1
SET default COLLATION ES_ES;

脚本 - 将此操作执行到您要更改的活动数据库!