upper()
函数似乎不会将法语字符大写,例如 ë。
使用大写时如何添加对法语字符的重音支持?
-- Returns 0 rows
SELECT * FROM TABLE
WHERE UPPER(NAME) = "NOËLLE";
我们使用 Informix 11.10,区域设置设置为 en_us.8859-1
。
最佳答案
与很多事情一样,问题是历史和大客户的复合体。
与几乎任何其他语言环境不同,Informix 的默认 en_us.8859-1
语言环境不会对重音字符进行大小写映射。您应该可以使用另一种选择 - en_us.8859-1@extn
。您可以在 0333extn.lco
文件中的 $INFORMIXDIR/gls/lc11/en_us
目录中找到它(这个名称背后有一个基本原理;解释起来很复杂) .
不幸的是,AFAICT,您必须使用替代区域设置重建数据库才能使其正常工作 - 但当您这样做时,它确实可以工作。
演示代码很棘手 - 您在浏览器中看到的内容是用 UTF-8 而不是 8859-1 编码的。因此,您必须知道如何将数据从一个代码集转换为另一个代码集,而 iconv
命令可能是您最好的 friend (它比使用我的临时工具要容易得多)。
我创建了以下文件 (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
更改,这就是您正在/正在观察到的问题。
针对使用 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 显示的 REPLACE 操作序列。在他们的 answer 。 Informix 还没有 TRANSLATE 函数来批量映射字符。
关于sql - Informix Upper() 不支持法语字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48428789/