sql - Informix Upper() 不支持法语字符

标签 sql ascii informix extended-ascii

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_LOCALECLIENT_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/

相关文章:

bash - 将 shell 脚本设置为 utf8

python - python中如何不自动将byte转换为ascii

Informix 外部表传递文件名作为参数

sql - 内部带有 IF 语句的 LAST_VALUE 不回填其分区 --> 选择每个分区的第一行时丢失最后的值 (BigQuery/SQL)

MySQL - 在 3 列中选择重复项并与另一个表连接以进行过滤

regex - 搜索非 ASCII 文档

informix - Informix 4GL 中的类型转换

linux - 具有 64 位 unixODBC 段错误的 Informix

sql - oracle 的超前和滞后功能的 Teradata 等价物

mysql - 两个 SQL 表上的数据透视表,其中一个包含 5m+ 行?