gpt4 book ai didi

sql - Firebird 配置 - 关闭区分大小写

转载 作者:行者123 更新时间:2023-12-04 18:35:18 30 4
gpt4 key购买 nike

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

最佳答案

尝试使用类似的东西:想象一下,您有一张像这样的人的 table :

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 只有两个 Czech 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

关于sql - Firebird 配置 - 关闭区分大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3840872/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com