尝试更改 Informix 数据库字符集
Trying to change Informix Database character set
概述:我正在尝试将 Informix 数据库字符集从 en_us.819
(ISO Latin 1
或默认字符集)更改为 en_us.57372
(UTF8
字符集)。
详细信息:我有一个 informix 实例,我们称它为 SA,它有一些字符集为 ISO Latin 1
的数据库,而其他数据库为 utf8
。我目前正在尝试将数据库转换为 SA 中的 DB1,从 ISO Latin 1
改为 utf8
。我已经通过 DB1 并确保数据库中只存在 ASCII
个字符。这应该意味着无论字符编码是否更改,字符都将显示相同。但是我似乎无法找到一种方法来更改单个数据库的字符集。我已尝试更新该数据库的 sysmaster::sysdbslocale
。然而,这并没有奏效。有谁知道在 Informix 数据库中执行此操作的方法。
没有支持的方法来就地更改 Informix 数据库的代码集。
处理它的可靠方法是导出数据(DB-Export,又名 dbexport
),然后导入指定新代码集的数据(DB-Import,又名 dbimport
).根据数据库大小和服务器大小,您可能需要在重新创建新数据库之前删除旧数据库,或者您可以使用 RENAME DATABASE 来帮助您。在您的情况下,您似乎不需要通过代码集转换过程,因为您没有要处理的重音字符。如果有,您需要考虑使用 iconv
或类似工具来转换卸载数据文件中的数据。
如果现有数据库是 dbname
,那么您可以在将数据导入为数据库 dbname
之前使用 rename database dbname to old_dbname
。或者您可以将数据导入为数据库 new_dbname
,然后执行两次重命名操作 (rename database dbname to old_dbname; rename database new_dbname to dbname;
)。这里有很多选项。
如果不能接受,您可能需要联系 IBM Informix 技术支持寻求帮助;他们也许可以帮助你。但是,对于给定数据库,更改不仅仅是更改 sysmaster
数据库中的信息——它涉及在要更改的实际数据库中的多个位置写入信息,其中一些位置无法通过SQL 更新操作。
要添加 Jonathan 的回答,这里有一个从 819 到 UTF8 的简单示例
使用相同的区域设置导出,因此没有代码集转换:
informix@irk:/usr3/products/12.10$ dbaccess sysmaster -
Database selected.
> select * from sysdbslocale where dbs_dbsname='stores7';
dbs_dbsname stores7
dbs_collate en_US.819
1 row(s) retrieved.
>
informix@irk:/usr3/products/12.10$
informix@irk:/usr3/products/12.10$ export DB_LOCALE=en_US.819
informix@irk:/usr3/products/12.10$ export CLIENT_LOCALE=en_US.819
informix@irk:/usr3/products/12.10$ dbexport stores7 -ss
{ DATABASE stores7 delimiter | }
grant dba to "informix";
grant resource to "public";
....
....
update statistics medium for table "informix".sysxtdtypes (
owner, source)
resolution 2.00000 0.95000 ;
dbexport completed
informix@irk:/usr3/products/12.10$
重命名数据库:
informix@irk:/usr3/products/12.10$ dbaccess sysmaster -
Database selected.
> rename database stores7 to stores7_819;
Database renamed.
>
informix@irk:/usr3/products/12.10$
使用新的区域设置导入(将会有从 819 (8859-1) 到 UTF-8 的转换)
informix@irk:/usr3/products/12.10$ export DB_LOCALE=en_US.utf8
informix@irk:/usr3/products/12.10$ dbimport stores7
{ DATABASE stores7 delimiter | }
grant dba to "informix";
grant resource to "public";
....
....
dbimport completed
informix@irk:/usr3/products/12.10$
informix@irk:/usr3/products/12.10$ dbaccess sysmaster -
Database selected.
> select * from sysdbslocale where dbs_dbsname='stores7';
dbs_dbsname stores7
dbs_collate en_US.57372
1 row(s) retrieved.
>
informix@irk:/usr3/products/12.10$
概述:我正在尝试将 Informix 数据库字符集从 en_us.819
(ISO Latin 1
或默认字符集)更改为 en_us.57372
(UTF8
字符集)。
详细信息:我有一个 informix 实例,我们称它为 SA,它有一些字符集为 ISO Latin 1
的数据库,而其他数据库为 utf8
。我目前正在尝试将数据库转换为 SA 中的 DB1,从 ISO Latin 1
改为 utf8
。我已经通过 DB1 并确保数据库中只存在 ASCII
个字符。这应该意味着无论字符编码是否更改,字符都将显示相同。但是我似乎无法找到一种方法来更改单个数据库的字符集。我已尝试更新该数据库的 sysmaster::sysdbslocale
。然而,这并没有奏效。有谁知道在 Informix 数据库中执行此操作的方法。
没有支持的方法来就地更改 Informix 数据库的代码集。
处理它的可靠方法是导出数据(DB-Export,又名 dbexport
),然后导入指定新代码集的数据(DB-Import,又名 dbimport
).根据数据库大小和服务器大小,您可能需要在重新创建新数据库之前删除旧数据库,或者您可以使用 RENAME DATABASE 来帮助您。在您的情况下,您似乎不需要通过代码集转换过程,因为您没有要处理的重音字符。如果有,您需要考虑使用 iconv
或类似工具来转换卸载数据文件中的数据。
如果现有数据库是 dbname
,那么您可以在将数据导入为数据库 dbname
之前使用 rename database dbname to old_dbname
。或者您可以将数据导入为数据库 new_dbname
,然后执行两次重命名操作 (rename database dbname to old_dbname; rename database new_dbname to dbname;
)。这里有很多选项。
如果不能接受,您可能需要联系 IBM Informix 技术支持寻求帮助;他们也许可以帮助你。但是,对于给定数据库,更改不仅仅是更改 sysmaster
数据库中的信息——它涉及在要更改的实际数据库中的多个位置写入信息,其中一些位置无法通过SQL 更新操作。
要添加 Jonathan 的回答,这里有一个从 819 到 UTF8 的简单示例
使用相同的区域设置导出,因此没有代码集转换:
informix@irk:/usr3/products/12.10$ dbaccess sysmaster -
Database selected.
> select * from sysdbslocale where dbs_dbsname='stores7';
dbs_dbsname stores7
dbs_collate en_US.819
1 row(s) retrieved.
>
informix@irk:/usr3/products/12.10$
informix@irk:/usr3/products/12.10$ export DB_LOCALE=en_US.819
informix@irk:/usr3/products/12.10$ export CLIENT_LOCALE=en_US.819
informix@irk:/usr3/products/12.10$ dbexport stores7 -ss
{ DATABASE stores7 delimiter | }
grant dba to "informix";
grant resource to "public";
....
....
update statistics medium for table "informix".sysxtdtypes (
owner, source)
resolution 2.00000 0.95000 ;
dbexport completed
informix@irk:/usr3/products/12.10$
重命名数据库:
informix@irk:/usr3/products/12.10$ dbaccess sysmaster -
Database selected.
> rename database stores7 to stores7_819;
Database renamed.
>
informix@irk:/usr3/products/12.10$
使用新的区域设置导入(将会有从 819 (8859-1) 到 UTF-8 的转换)
informix@irk:/usr3/products/12.10$ export DB_LOCALE=en_US.utf8
informix@irk:/usr3/products/12.10$ dbimport stores7
{ DATABASE stores7 delimiter | }
grant dba to "informix";
grant resource to "public";
....
....
dbimport completed
informix@irk:/usr3/products/12.10$
informix@irk:/usr3/products/12.10$ dbaccess sysmaster -
Database selected.
> select * from sysdbslocale where dbs_dbsname='stores7';
dbs_dbsname stores7
dbs_collate en_US.57372
1 row(s) retrieved.
>
informix@irk:/usr3/products/12.10$