尝试更改Informix数据库字符集

时间:2018-02-23 19:32:09

标签: sql database character-encoding informix

概述:我正在尝试将Informix数据库字符集从en_us.819ISO Latin 1或默认字符集)更改为en_us.57372UTF8字符集)。

详细信息:我有一个informix实例,我们可以将其称为SA,其中包含一些字符集为ISO Latin 1的数据库,而其他数据库为utf8。我目前正在尝试转换数据库,可以将SA中的DB1称为utf8中的ISO Latin 1。我已通过DB1并确保数据库中只存在ASCII个字符。这意味着无论字符编码是否改变,字符都将显示相同。但是,我似乎无法找到更改单个数据库的字符集的方法。我试图更新该数据库的sysmaster::sysdbslocale。然而,这没有奏效。有没有人知道在Informix数据库中执行此操作的方法。

2 个答案:

答案 0 :(得分:2)

要添加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$ 

答案 1 :(得分:1)

没有受支持的方法来原位更改Informix数据库的代码集。

处理它的可靠方法是导出数据(DB-Export,又名dbexport),然后导入指定新代码集的数据(DB-Import,又名dbimport)。根据数据库大小和服务器大小,您可能需要在重新创建新数据库之前删除旧数据库,或者您可以使用RENAME DATABASE来帮助您。在您的情况下,您似乎不需要经历代码集转换过程,因为您没有要处理的重音字符。如果有的话,您需要考虑使用iconv或类似工具来转换卸载数据文件中的数据。

如果现有数据库是dbname,那么在将数据导入数据库rename database dbname to old_dbname之前,您可以使用dbname。或者您可以将数据作为数据库new_dbname导入,然后执行两次重命名操作(rename database dbname to old_dbname; rename database new_dbname to dbname;)。这里有很多选择。

如果这是不可接受的,您可能需要联系IBM Informix技术支持部门寻求帮助;他们或许可以帮助你。但是,改变的不仅仅是更改给定数据库的sysmaster数据库中的信息 - 它涉及在要更改的实际数据库中的多个位置写入信息,并且某些位置无法通过SQL更新操作。