Informix Upper()不使用法语字符

时间:2018-01-24 17:54:25

标签: sql ascii informix extended-ascii

upper()函数似乎不会将ë等法语字符大写。

使用鞋帮时,如何在法语字符上添加重音支持?

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

我们正在使用Informix 11.10,并且语言环境设置为en_us.8859-1

2 个答案:

答案 0 :(得分:3)

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

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

不幸的是,AFAICT,您必须使用备用区域设置重建数据库才能使其正常工作 - 但是当您这样做时,它确实有效。

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

我创建了以下文件(UTF8) - iconv

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,因此对数据库的更改不是永久性的(事务,包括CREATE TABLE语句,将被回滚)。

可以使用:

将其转换为8859-1
COMMIT

将重音字符映射到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@extnDB_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区域设置,那么您可能会在其The TTG Guy中缩小为answer所示的REPLACE操作序列。 Informix还没有TRANSLATE函数来批量映射字符。

答案 1 :(得分:0)

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

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";