我希望在Firebird数据库中执行不区分大小写的搜索,而不修改实际查询。换句话说,我想要所有现有的“SELECT / WHERE / LIKE”语句来检索BOB,Bob和bob。 Firebird配置是否允许修改此行为?
答案 0 :(得分:2)
尝试使用以下内容: 想象一下,你有一张像这样的人的桌子:
CREATE TABLE PERSONS (
PERS_ID INTEGER NOT NULL PRIMARY KEY,
LAST_NAME VARCHAR(50),
FIRST_NAME VARCHAR(50)
);
现在有一个应用程序,允许用户按姓氏和/或名字搜索人员。因此,用户输入他正在搜索的人的姓氏。
我们希望此搜索不区分大小写,即无论用户输入“Presley”,“presley”,“PRESLEY”,甚至“PrESley”,我们总是希望找到国王。
啊,是的,我们希望搜索速度快。所以必须有一个加速它的指数。
进行不区分大小写的比较的一种简单方法是将两个字符串大写,然后比较两个字符串的大写版本。
大写字母有局限性,因为有些字母不能大写。另请注意,有些语言/脚本不存在大小写。因此,本文中描述的技术最适合欧洲语言。
为了获得真正完美的结果,需要不区分大小写(CI)和/或重音不敏感(AI)校对。但是,在撰写本文时(2006年7月),Firebird 2.0只有两个捷克AI / CI排序规则。随着时间的推移,情况有望得到改善。
(您应该了解字符集和排序规则的概念,以便了解接下来会发生什么。我在我的示例中使用了DE_DE
排序规则,这是ISO8859_1
中德语/德语的排序规则字符集。)
为了从Firebird内置的UPPER()
函数获得正确的结果,您必须指定排序规则。这可以在表的DDL定义中:
CREATE TABLE PERSONS (
PERS_ID INTEGER NOT NULL PRIMARY KEY,
LAST_NAME VARCHAR(50) COLLATE DE_DE,
FIRST_NAME VARCHAR(50) COLLATE DE_DE
);
或者可以在调用UPPER()
函数时完成:
SELECT UPPER (LAST_NAME COLLATE DE_DE) FROM PERSONS;
http://www.destructor.de/firebird/caseinsensitivesearch.htm
或者您可以修改查询并添加lower()
功能
LOWER()
适用于:DSQL,ESQL,PSQL
添加于:2.0
描述:返回输入字符串的小写等效项。即使使用默认(二进制)排序规则,此功能也会正确地降低非ASCII字符的范围。字符集必须是合适的:例如,使用ASCII或NONE,只有ASCII字符是小写的;使用OCTETS,整个字符串将保持不变。
结果类型:VAR(CHAR)
语法:
LOWER (str)
重要
如果在数据库中声明了外部函数LOWER
,它将模糊内部函数。要使内部函数可用,请删除或更改外部函数(UDF)。
示例:
select field from table
where lower(Name) = 'bob'
http://www.firebirdsql.org/refdocs/langrefupd21-intfunc-lower.html
答案 1 :(得分:0)
最终我创建了包含必需字段的低版本版本的阴影列。
答案 2 :(得分:0)
Necromancing。
您可以指定排序规则而不是小写字段:
SELECT field FROM table
WHERE Name = 'bob' COLLATE UNICODE_CI
请参阅 https://firebirdsql.org/refdocs/langrefupd21-collations.html
也许您也可以将其指定为数据库的默认字符集,请参阅 http://www.destructor.de/firebird/charsets.htm