Informix Upper() 不适用于法语字符

Informix Upper() not working with French characters

upper() 函数似乎不会将法语字符大写,例如 ë.

如何在使用大写字母时为法语字符添加重音支持?

-- Returns 0 rows
SELECT * FROM TABLE
WHERE UPPER(NAME) = "NOËLLE";

我们使用的是 Informix 11.10,语言环境设置为 en_us.8859-1

您可以对要更改的每个字符使用嵌套替换语句。例如:

SELECT * FROM TABLE
WHERE REPLACE(REPLACE(UPPER(NAME),"ë","Ë"),"é","É")  = "NOËLLE";

以下是全部:

SELECT * FROM TABLE
WHERE REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( 
UPPER(NAME),"à","À"),"â","Â"),"ä","Ä"),"æ","Æ"),"ç","Ç"),"é","É"),"è","È"),"ê","Ê"),"ë","Ë"),"î","Î"),"ï","Ï"),"ô","Ô"),"œ","Œ"),"ù","Ù"),"û","Û"),"ü","Ü")  = "NOËLLE";

与很多东西一样,问题是历史和大客户的结合。

Informix 的默认 en_us.8859-1 语言环境不对重音字符进行大小写映射,这与几乎所有其他语言环境不同。您应该可以使用一个替代方案 — en_us.8859-1@extn。您会在文件 0333extn.lco$INFORMIXDIR/gls/lc11/en_us 目录中找到它(名称背后有一个基本原理;解释起来很复杂)。

不幸的是,AFAICT,您必须使用其他语言环境重建数据库才能使其正常工作 — 但当您这样做时,它确实有效。

演示代码很棘手 — 您在浏览器中看到的内容是用 UTF-8 编码的,而不是 8859-1。因此,您必须知道如何将数据从一个代码集转换为另一个代码集 — iconv 命令可能是您在这里最好的朋友(它比使用我的临时工具要容易得多)。

我创建了以下文件 (UTF8) — french-utf8.sql:

begin;
create table french_test(name varchar(32) not null);
insert into french_test values("noëlle");
insert into french_test values("ç'est rien");
insert into french_test values("être");
insert into french_test values("à la mode");
insert into french_test values("café au lait");
select name, upper(name) from french_test;

BEGIN但没有COMMIT,因此对数据库的更改不是永久性的(回滚事务,包括CREATE TABLE语句)。

可以使用以下方法转换为 8859-1:

iconv -f utf8 -t iso-8859-1 french-utf8.sql > french-8859-1.sql

将重音字符映射到 \xXY 十六进制转义,输出变为:

begin;
create table french_test(name varchar(32) not null);
insert into french_test values("no\xEBlle");
insert into french_test values("\xE7'est rien");
insert into french_test values("\xEAtre");
insert into french_test values("\xE0 la mode");
insert into french_test values("caf\xE9 au lait");
select name, upper(name) from french_test;

运行 针对普通 en_us.8859-1 数据库,输出为:

no\xEBlle|NO\xEBLLE
\xE7'est rien|\xE7'EST RIEN
\xEAtre|\xEATRE
\xE0 la mode|\xE0 LA MODE
caf\xE9 au lait|CAF\xE9 AU LAIT

如您所见,UPPER 未更改重音字符,这是您 are/were 观察到的问题。

运行 针对使用 en_us.8859-1@extn 创建的数据库(同时设置 DB_LOCALECLIENT_LOCALE),输出为:

no\xEBlle|NO\xCBLLE
\xE7'est rien|\xC7'EST RIEN
\xEAtre|\xCATRE
\xE0 la mode|\xC0 LA MODE
caf\xE9 au lait|CAF\xC9 AU LAIT

在这里您可以看到输出已将 \xE7 映射到 \xC7,其他字符也类似。


如果您不能使用 en_us.8859-1@extn 语言环境,那么您可能只能使用 The TTG Guy in their 所示的 REPLACE 操作序列。 Informix 还没有用于批量映射字符的 TRANSLATE 函数。