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

标签 sql configuration firebird case-sensitive

我希望在不修改实际查询的情况下在 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/

相关文章:

sql - SQL Server 的安全库

sql - 我如何选择非重复列或分组列并在表格中计数?

mysql - 在mysql数据集中添加缺失的日期

mysql - 更新列如果 count(id) 在表中有多个

database - 使用 Fluent NHibernate 使用 Nhibernate 生成数据库

c# - 如何管理 .NET 中多个类库的配置?

python - Django-firebird 无法工作

firebird - FB2.1 中的错误消息不正确

c - 如何从 Linux 下用 C 编写的 udf 返回 firebird 时间戳

mysql - 我需要找到一周内活跃天数的分布并创建一个表来显示每天有多少成员活跃