Firebird配置 - 关闭大小写敏感性

3

我希望在不修改实际查询的情况下,在Firebird数据库中执行大小写不敏感的搜索。换句话说,我希望所有现有的“SELECT/WHERE/LIKE”语句都能检索BOB、Bob和bob。Firebird配置是否允许修改此行为?


1
大小写敏感性由数据库的排序规则设置,并且通常在排序规则名称中明确指出(“cs”表示“大小写敏感”,而“ci”表示“大小写不敏感”)。这里是Firebird的排序规则链接:http://www.firebirdsql.org/refdocs/langrefupd21-collations.html - OMG Ponies
3个回答

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

我认为这应该是被接受的答案。 - Jesús López

0

最终,我选择创建包含所需字段的小写版本的影子列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接