Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 将字符集从ISO8859_1转换为UTF8_Database_Character_Firebird_Collation - Fatal编程技术网

Database 将字符集从ISO8859_1转换为UTF8

Database 将字符集从ISO8859_1转换为UTF8,database,character,firebird,collation,Database,Character,Firebird,Collation,我在firebird 2.5中有一个数据库,里面装满了数据。 我需要将字符集从UTF-8更改为ISO8859_1,我尝试了: alter数据库默认字符集ISO8859\u 1排序规则ES\u ES 但它不起作用。谢谢你的帮助 ALTER CHARACTER SET ISO8859_1 SET default COLLATION ES_ES; 将此脚本执行到要更改的活动数据库 更改默认字符集只会影响更改后创建的列(没有显式字符集)。现有列不受影响,因为字符集是每个单独列的属性。这意味着您必须更改

我在firebird 2.5中有一个数据库,里面装满了数据。 我需要将字符集从UTF-8更改为ISO8859_1,我尝试了:

alter数据库默认字符集ISO8859\u 1排序规则ES\u ES

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

ALTER CHARACTER SET ISO8859_1
SET default COLLATION ES_ES;

将此脚本执行到要更改的活动数据库

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

有几个问题

  • Firebird不会在更改时间更改数据,而是创建一个新的格式版本,并在选定时间动态地从旧格式转换为新格式。
    这会影响性能,但也会导致运行时的字符串转换错误(例如,因为ISO-8859-1中不存在UTF-8字符)
  • 只有在列当前具有真实字符集(即除
    NONE
    OCTETS
    外)时,更改字符集才能正常工作。 从
    NONE
    OCTETS
    转换到另一个字符集可能会导致字符串转换错误或垃圾,因为内容可能与您的期望不符,或者目标字符集中的字节可能无效
  • 有些版本-iirc-实际上根本不会更改字符集
  • 要解决这些问题,您可以执行以下操作:

  • 导出数据库的DDL、更改字符集定义、创建新数据库并使用数据泵工具(如FBCopy)将数据从旧数据库复制到新数据库
  • 或者,对于要更改的每个列:
    • 创建一个新列
    • updatetable SET newcolumn=oldcolumn
      (或者如果oldcolumn是
      NONE
      OCTETS
      updatetable SET newcolumn=cast(cast(oldcolumn作为VARCHAR(…)字符集assumedcharset)作为VARCHAR(…)字符集targetcharset)
    • 删除旧列
    • 重命名新列
    • 修复任何其他依赖性问题(索引、触发器、外键等)

  • 只有当您想要更改一个小型数据库(在表、列和依赖项方面)时,第二个选项才更可取或者您需要执行奇数转换,否则我强烈建议您使用数据泵解决方案。

    这不会更改列的字符集,这会更改指定字符集的默认排序规则。为了帮助您,我将尝试一下,并告诉您结论。这似乎行得通,非常感谢您的回答!您祝我生日快乐!!