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_LOCALE
和 CLIENT_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 函数。
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_LOCALE
和 CLIENT_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