Sql Informix Upper()不使用法语字符

Sql Informix Upper()不使用法语字符,sql,ascii,informix,extended-ascii,Sql,Ascii,Informix,Extended Ascii,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),"ë","Ë"),"é",

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
locale不为重音字符进行大小写映射,这与几乎任何其他语言环境不同。您应该可以使用另一种选择-
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
,因此对数据库的更改不是永久性的(事务,包括CREATETABLE语句,被回滚)

可通过以下方式转换为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
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
如您所见,重音字符不会因
UPPER
而改变,这是您正在/正在观察的问题

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

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
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
locale,则您可能会被简化为替换操作的顺序,如中所示。Informix还没有用于批量映射字符的TRANSLATE函数。

True,但是这很麻烦,您使用的是哪个版本的Informix?数据库配置为使用哪个代码集(区域设置)?您的数据输入到哪个代码集(区域设置)?当我使用配置了
DB\u LOCALE=“en\u us.utf8”
(并且
CLIENT\u LOCALE
也设置为相同)的数据库进行测试时,上面的函数对UTF-8数据起作用。在另一个具有
DB\u LOCALE=fr\u fr.8859-15
的数据库中,上面的函数也可以正确处理885015个字符。从问题中复制文本没有帮助;它在UTF-8中,但这可能是您正在使用的代码集,也可能不是。该映射同时适用于NVARCHAR和VARCHAR column.JFTR:我在一个运行Informix 12.10.FC9W1(不是仿古版,但不是最新版本)的仿古Linux机器(我想是RedHat 5.3)上进行了测试。我是从Mac上的Unicode终端驱动它的。从UTF-8数据锐利工具创建8859-15重音数据是一件很有趣的事情,而且
tr
的知识让它完成了,不过如果我对
iconv
了解得足够好,它可能会更容易完成这项工作。我们使用的是Informix版本11。我们所有的数据库上的代码集都是en_us.8859-1.11.10或11.50或11.70?在第一次和最后一次之间有相当长的时间。我会在一个
en_us.8859-1
数据库中搜索,看看我找到了什么。@JonathanLeffler谢谢你的帮助。这是11.10Wow版,回答得非常好,信息量也非常丰富。我现在更清楚地了解这种情况,根据您的建议,切换到不同的语言环境似乎是保持代码整洁的最佳解决方案。谢谢你的帮助!