Firebird配置 - 关闭区分大小写

时间:2010-10-01 15:55:15

标签: sql configuration firebird case-sensitive

我希望在Firebird数据库中执行不区分大小写的搜索,而不修改实际查询。换句话说,我想要所有现有的“SELECT / WHERE / LIKE”语句来检索BOB,Bob和bob。 Firebird配置是否允许修改此行为?

3 个答案:

答案 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