如何编译 Informix GLS 语言环境/字符集。 (将 .lc 文件转换为 .lco 以创建数据库的 Informix 语言环境)

Posted

技术标签:

【中文标题】如何编译 Informix GLS 语言环境/字符集。 (将 .lc 文件转换为 .lco 以创建数据库的 Informix 语言环境)【英文标题】:How to compile an Informix GLS Locale/Character Set. (.lc file into .lco to make an Informix locale for databases) 【发布时间】:2018-08-15 16:46:48 【问题描述】:

概览:

我正在尝试制作自己的 GLS 语言环境/字符集。我这样做是为了将其添加到GLS/lc11/en_us/myfile.lco 下的 informix 实例中的语言环境中,这样我就可以将我的数据库/数据库语言环境设置为我刚刚创建的语言环境。

详情:

    我正在为 GLS 语言环境/字符集创建一个 .lc 文件。但是,我找不到如何将 .lc 文件编译成 .lco 文件。如何将.lc 文件编译成.lco 文件。 我还在寻找更多.lc 文件的示例,以作为我的基础。有谁知道我在哪里可以找到一些例子。我知道在informix 实例中它们存储在文件夹$INFORMIXDIR/GLS/lc11/os/ 中。

如果这不是您在 Informix 中创建 .lco GLS 字符集的方式。正确的步骤是什么?我还缺少任何步骤吗?

【问题讨论】:

简短的回答是你不能。 GLS 编译器在外部不可用(很确定它从来没有)。使用语言环境文件(尤其是代码集定义)可能对 IDS 实例非常有害。请问你想达到什么目的? .lc 文件仅用于整理目的(订单/货币/等) 【参考方案1】:

(我将其作为答案,因为将其作为评论太大了,从技术上讲,这个问题的答案应该是:“你不能,没有可供外部使用的 Informix GLS 编译器")

看看你之前的问题,我猜你想要什么,是一种过滤 ascii 字符的方法。 即使你可以,我也不会去写你自己的 gls 定义,它并不像听起来那么简单。

Informix 有一个纯 ASCII 语言环境:

d:\infx\ids12\gls\cm3>grep ASCII registry
#         ASCII characters (except that a code-set name cannot begin with
#         The code-set number consists of 1 or more decimal ASCII digits
ASCII           364     # 0x016c

d:\infx\ids12\gls\cm3>

只有某些语言有它(如德语或西班牙语):

d:\infx\ids12\gls\cm3>dir ..\..\016c.* /s
 Volume in drive D is Data750
 Volume Serial Number is F0B7-2E46

 Directory of d:\infx\ids12\gls\cm3

21/01/2017  20:23             6,408 016c.cmo
               1 File(s)          6,408 bytes

 Directory of d:\infx\ids12\gls\lc11\de_de

21/01/2017  20:25             4,369 016c.lco
               1 File(s)          4,369 bytes


 Directory of d:\infx\ids12\gls\lc11\es_es

21/01/2017  20:25             4,611 016c.lco
               1 File(s)          4,611 bytes

但没有什么能阻止您将语言环境文件 (.lco) 复制到“en_us”目录并使用它(当然,仅用于测试目的)。

d:\infx\ids12\gls\cm3>cp d:\infx\ids12\gls\lc11\de_de\016c.lco d:\infx\ids12\gls\lc11\en_us

d:\infx\ids12\gls\cm3>

d:\infx\ids12\gls\cm3>dir d:\infx\ids12\gls\lc11\en_us
 Volume in drive D is Data750
 Volume Serial Number is F0B7-2E46

 Directory of d:\infx\ids12\gls\lc11\en_us

09/03/2018  11:07    <DIR>          .
09/03/2018  11:07    <DIR>          ..
09/03/2018  11:07             4,369 016c.lco
21/01/2017  20:25             2,666 0333.lco
21/01/2017  20:25             7,578 0333dict.lco
21/01/2017  20:25             4,071 0333dres.lco
21/01/2017  20:25             4,096 0333extn.lco
21/01/2017  20:25             4,412 0352.lco
21/01/2017  20:25             7,955 0352dict.lco
21/01/2017  20:25             4,410 04e4.lco
21/01/2017  20:25             7,824 04e4dict.lco
21/01/2017  20:25             7,818 04e4edic.lco
21/01/2017  20:25             4,410 04e4euro.lco
21/01/2017  20:25            63,649 e005.lco
21/01/2017  20:25            85,484 e01c.lco
21/01/2017  20:25             2,668 e02f.lco
21/01/2017  20:25             7,815 e02fdict.lco
21/01/2017  20:25            64,886 e030.lco
              16 File(s)        284,111 bytes
               2 Dir(s)  234,801,618,944 bytes free

d:\infx\ids12\gls\cm3>

之后,您应该能够使用“en_US.ascii”语言环境创建数据库:

D:\infx\ids12>set DB_LOCALE=en_US.ascii

D:\infx\ids12>set CLIENT_LOCALE=en_US.1252

D:\infx\ids12>dbaccess - -
> create database enusascii with log;

Database created.

> select * from sysmaster:sysdbslocale where dbs_dbsname='enusascii';

dbs_dbsname  enusascii
dbs_collate  en_US.364

1 row(s) retrieved.

>

如果您尝试插入大于 0x7F 的任何内容,它应该会抱怨:

D:\infx\ids12>od -t x1 test_ascii.unl
0000000000    74  D6  73  74  7C  0D  0A
0000000007

D:\infx\ids12>cat test_ascii.unl
t€st|

D:\infx\ids12>

....
Database created.

> create table t1(c1 char(10));

Table created.

> load from test_ascii.unl insert into t1;

23103: Code-set conversion function failed due to illegal sequence or invalid value.

  847: Error in load file row 1.
Error in line 1
Near character position 40
>

同一文件可以加载到 819 数据库中:

D:\infx\ids12>set | grep LOCALE
CLIENT_LOCALE=en_US.1252
DB_LOCALE=en_US.819

D:\infx\ids12>dbaccess enus819 -

Database selected.

> load from test_ascii.unl insert into t1;

1 row(s) loaded.

>

您会得到 23103,因为 GLS 转换函数检测到 0xD6 值 ('Ö') 的映射无效。 1252和ASCII之间的转换文件显示大于0x7F的任何东西都会抛出错误。

<source_version>        2
<modified_date>     "05-04-2004"
<source_codeset>      "Windows Code Page 1252"
<target_codeset>      "ASCII 7-Bit"

# Conversion Table
\x00...\xff \x00... #  Default everything onto itself
\x80    \x7f error  #  euro-sign
\x82    \x7f error  #  single low-9 quotation mark 
\x83    \x7f error  #  dutch guilder sign (ibm437 159) 
....    same.....
....
\xfd    \x7f error  #  latin small letter y with acute 
\xfe    \x7f error  #  latin small letter thorn (icelandic) 
\xff    \x7f error  #  latin small letter y with diaeresis 

请记住,只有在代码集之间发生转换时,您才会收到错误消息。如果您的 CLIENT_LOCALE 与您的 DB_LOCALE 相同,那么当您告诉客户不需要转换时,没有人会“过滤/验证”您的数据。

【讨论】:

感谢您进一步了解情况。

以上是关于如何编译 Informix GLS 语言环境/字符集。 (将 .lc 文件转换为 .lco 以创建数据库的 Informix 语言环境)的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用gls函数拟合模型并可视化模型的预测值及其置信区间实战

如何在 informix 中插入 blob 或 clob 列

如何在 Informix 数据库表中使用列别名

Informix数据库配置与连接

在 Windows 上使用 pyodbc 连接到 Informix

如何在informix的插入查询中添加行跳转?