我正在通过 SQL Server 执行以下 DB2 SQL(因此需要在 DB2 SQL 中):
exec ('
select
TRIM (vhitno) AS "Item",
TRIM (mmitds) AS "Description",
TRIM (SUBSTRING (vhitno,12,4)) AS "Size",
vhalqt AS "Available"
from m3fdbtest.oagrln
left outer join m3fdbtest.mdeohe
on vhcono = uwcono
and vhcuno = uwcuno
and vhagno = uwagno
and vhitno = uwobv1
left outer join m3fdbtest.mitmas
ON vhcono = mmcono
AND vhitno = mmitno
where uwcono = 1
and uwstdt >= ?
and uwlvdt <= ?
and uwcuno = ''JBHE0001''
and uwagst = ''20''
and (vhitno LIKE ''%'' || ? || ''%''
or mmitds LIKE ''%'' || ? || ''%'')',
@From, @To, @Search, @Search) at M3_TEST_ODBC
但是,DB2 区分大小写 - 如何使 mmitds 和 vhitno 上的两个 LIKE 不区分大小写?
你可以使用这样的东西:
where UPPER(mycol) like '%' || UPPER(?) || '%'
注意:这可能会影响索引选择,但您可以创建如下索引:
create index MYINDEX on MYTABLE (UPPER(mycol))
如果您使用的是嵌入在 RPG 中的 SQL,则可以将程序设置为使用不区分大小写的排序和比较
SET OPTION SRTSEQ=*LANGIDSHR;
要使用 JDBC 执行此操作,您需要设置以下驱动程序属性:
"sort" = "language"
"sort language" = Your language code, I use "ENU"
"sort weight" = "shared"
对于 ODBC 连接,需要设置以下连接属性:
SORTTYPE = 2
LANGUAGE = your language code, I use ENU
SORTWEIGHT = 0
这是一个常见问题解答,所以也许你应该阅读更多,例如:这篇文章是众多文章之一,并且存在各种方法。示例原则适用于 i-series 作为 Linux/Unix/Windows,即使实现不同。
如果您无法访问进行表更改(例如添加列、索引等),那么您可能会遭受在谓词列上使用UPPER()
或LOWER()
的性能损失。这可能会导致这些列上的索引无法使用,并降低性能。
您应该首先验证 Db2 表中的相关列是否确实具有混合大小写值,如果它们只有一个大小写,则更改查询以确保与该大小写进行比较。
如果列具有混合大小写值,并且不存在固定大小写列(或 UDF),并且如果出于重要的业务目的频繁运行查询,则最佳建议是通过多种方法中的任何一种确保表具有适当的设计(以支持不区分大小写的比较)。
如果您的 Db2 版本中有正则表达式函数,那么还可以考虑使用 REGEXP_LIKE 和合适的正则表达式。
数据库设置
您可以在创建数据库时设置数据库配置设置。不过,它基于Unicode。
CREATE DATABASE yourDB USING COLLATE UCA500R1_S1
默认的 Unicode 排序规则算法由 UCA500R1 关键字实现,没有任何属性。由于默认 UCA 不能同时包含 Unicode 支持的每种语言的整理顺序,因此可以指定可选属性来自定义 UCA 排序。属性由下划线 (_) 字符分隔。UCA500R1关键字和任何属性构成 UCA 排序规则名称。
"强度"属性确定在整理或比较文本字符串时是考虑重音还是大小写。在没有大小写或重音的书写系统中,"强度"属性控制类似的重要特征。 可能的值为:小学 (1)、中学 (2)、第三级 (3)、第四纪 (4) 和身份 (I)。要忽略:
- 重音和大小写,使用主要强度级别
- 仅案例,使用次要强度级别
- 既不重音也不大小写,使用三级强度等级
几乎所有字符都可以通过前三个强度级别来区分,因此在大多数区域设置中,默认的强度属性设置为第三级别。但是,如果 Alternate 属性(如下所述)设置为移位,则四元强度级别可用于断开空格字符、标点符号和符号之间的联系,否则这些符号将被忽略。标识强度级别用于区分相似字符,例如数学粗体小 A 字符 (U+1D41A) 和数学斜体小 A 字符 (U+1D44E)。
将"强度"属性设置为更高级别将减慢文本字符串比较速度并增加排序键的长度。 例子:
- UCA500R1_S1将整理"角色"="角色"="rôle">
- UCA500R1_S2将整理"角色"="角色"<"rôle">
- UCA500R1_S3将整理"角色"<"角色"<"rôle">
这对我有用。如您所见,..._S2也忽略了大小写。
使用较新的标准版本,它应如下所示:
CREATE DATABASE yourDB USING COLLATE CLDR181_S1
排序规则关键字:UCA400R1
= Unicode Standard 4.0 = CLDR 版本 1.2UCA500R1
= Unicode Standard 5.0 = CLDR 版本 1.5.1CLDR181
= Unicode Standard 5.2
= CLDR 版本 1.8.1
如果您的数据库已经创建,应该有一种方法可以更改设置。
CALL SYSPROC.ADMIN_CMD( 'UPDATE DB CFG USING DB_COLLNAME UCA500R1_S1 ' );
我确实在执行这个时遇到问题,但据我所知,它应该可以工作。
生成的表行
其他选项包括例如生成大写行:
CREATE TABLE t (
id INTEGER NOT NULL PRIMARY KEY,
str VARCHAR(500),
ucase_str VARCHAR(500) GENERATED ALWAYS AS ( UPPER(str) )
)@
INSERT INTO t(id, str)
VALUES ( 1, 'Some String' )@
SELECT * FROM t@
ID STR UCASE_STR
----------- ------------------------------------ ------------------------------------
1 Some String SOME STRING
1 record(s) selected.
对于使用 db2/400 并通过 php/pdo 进行连接的我,我在/QOpenSys/etc/odbc.ini 中向 odbc 中添加了一个 DSN.ini,其中包含 jmarkmurphy 指定的共享权重的以下连接选项子集:
[DSN]
SortSequence = 2
LanguageID = ENU
SortWeight = 0
可在此处找到 IBM odbc 连接选项