upper()
函数似乎不会将ë等法语字符大写。
使用鞋帮时,如何在法语字符上添加重音支持?
-- Returns 0 rows
SELECT * FROM TABLE
WHERE UPPER(NAME) = "NOËLLE";
我们正在使用Informix 11.10,并且语言环境设置为en_us.8859-1
。
答案 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-1COMMIT
将重音字符映射到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
区域设置,那么您可能会在其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";