【问题标题】:Trying to change Informix Database character set尝试更改 Informix 数据库字符集
【发布时间】:2018-08-03 22:21:17
【问题描述】:

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

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

【问题讨论】:

    标签: sql database character-encoding informix


    【解决方案1】:

    要添加乔纳森的答案,这里有一个从 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$ 
    

    【讨论】:

    • 谢谢,这很有帮助,是一个很好的循序渐进的例子。
    【解决方案2】:

    没有一种支持的方式来现场更改 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 更新访问操作。

    【讨论】:

    • 谢谢。这证实并澄清了我之前的想法。
    猜你喜欢
    • 2018-08-11
    • 2013-11-01
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多