【常见问题】文本搜索组件如何实现搜索时忽略字母大小写?


飞致云 发布于 2023-02-20 / 448 阅读 / 0 评论 /
1. 前言 本文介绍如何在文本组件中实现忽略英文字母大小写来搜索内容(使用 MySQL 数据源直连模式)。 比如下图,在文本搜索组件中输入 “c” 则可以筛选出 Area 列包含小写字母“c”的数据。 如果你输入 “c” 时只列出了包含 “c” 的数据,而你希望同时筛选出包含大写 “C” 和小写 “

1. 前言

本文介绍如何在文本组件中实现忽略英文字母大小写来搜索内容(使用 MySQL 数据源直连模式)。

比如下图,在文本搜索组件中输入 “c” 则可以筛选出 Area 列包含小写字母“c”的数据。

如果你输入 “c” 时只列出了包含 “c” 的数据,而你希望同时筛选出包含大写 “C” 和小写 “c” 的数据,根据本文的配置修改 Collation 即可实现。

2. 配置

2.1 修改字段的校对规则(Collation)

① 查询当前 Collation

此处以 MySQL 数据库为例,参考如下操作将字段的校对规则修改为 _ci 后缀的校对规则即可。

以我的数据库表 general_ci_test 为例,先查看当前表的 Collation。

show full columns from <表名>;

可以看到 Area 字段的 Collation 是 utf8_bin,是大小写敏感的。

② 修改 Collation

我们使用如下 SQL 将其修改为 utf8_general_ci 就可以实现搜索时大小写不敏感。

ALTER TABLE `<库名>`.`<表名>`
MODIFY COLUMN `<字段名>` <字段类型> CHARACTER SET utf8 COLLATE utf8_general_ci ;

③ 修改后使用文本搜索忽略大小写效果

2.2 修改表的校对规则(Collation)

如果表中的所有字段都需要忽略大小写,则无需为每个字段配置 Collation,修改表的校对规则即可。

以我的数据库表 general_ci_test 为例,先查看当前表的 Collation。

show table status from <数据库名称> like '<表名>';

可以看到当前表 Collation  是 utf8_bin,是大小写敏感的,我们将其修改为 utf8_general_ci 就可以实现搜索时大小写不敏感。

ALTER TABLE `test`.`general_ci_test` COLLATE = utf8_general_ci;

Tip:需要注意,如果已经为某个字段指定了 Collation 则查询此字段时会优先使用字段中的 Collation 配置,而不会使用表中的 Collation。另外若果所有表都需要修改,也可以修改整个数据库的默认 Collation,此处不再展开。

3. 扩展阅读

3.1 DataEase 查询逻辑

在 DataEase 中制作图表时,DataEase 会生成 SQL 来查询我们的数据库,然后使用查询出的数据生成图表。

我们在搜索框中输入 “C” 时,DataEase 会生成一个模糊查询的 SQL,示意如下(此处仅做示意,实际SQL并非如此,但原理类似):

select * from table where area like '%C%';

3.2 COLLATE、Collation 是什么?

在 MySQL 中,COLLATE 和 Collation 都是指校对规则。COLLATE 是一个关键字,用于在 SQL 语句中指定一个特定的校对规则,而 Collation 则是一个名词,用于描述一个字符集和它所对应的校对规则。

COLLATE(校对规则)用于指定字符集的比较规则。字符集是一组字符的编码方式,而校对规则则是用于确定字符集中字符的比较和排序规则。在 MySQL 中,每个字符集都有一组默认的校对规则,但是我们可以通过在 SQL 语句中指定 COLLATE 参数来修改默认的校对规则,从而实现按不同规则进行字符的比较和排序。

使用 COLLATE 参数可以解决一些语言字符集的特殊排序需求,如汉字的拼音排序或者拉丁字母的大小写不敏感排序等。在实际应用中,可以根据具体需求选择合适的字符集和校对规则,以确保数据的正确比较和排序。

3.3 utf8_bin 和 utf8_general_ci 有什么区别?

在 MySQL 中,utf8_bin 和 utf8_general_ci 是两种常见的校对规则(Collation)。它们的区别在于排序规则和字符比较方式。

  • utf8_bin:以二进制方式比较字符串。在二进制比较中,每个字符都有一个对应的 ASCII 码或 Unicode 编码,比较时直接比较它们的编码值大小,因此区分大小写,且不考虑字符的语言、语境等其他因素,排序时也是按照编码值大小排序。因此,使用 utf8_bin 校对规则进行字符比较和排序时,会将不同大小写的字符和不同语言的字符看作完全不同的字符。

  • utf8_general_ci:基于字符的语言和语境进行比较和排序。ci 是 Case Insensitive 的缩写,即 "大小写不敏感",这种校对规则会忽略字符的大小写,并且会把某些字符视为相同的字符。例如,它会把拉丁字母的大小写视为相同,把一些重音符号或变音符号视为相同。在排序时,它会根据字符的语言和语境对字符进行比较和排序。

因此,如果需要对字符的大小写、语言和语境进行严格的比较和排序,可以选择 utf8_bin 校对规则;如果需要对字符的语言和语境进行比较和排序,并且忽略大小写,可以选择 utf8_general_ci 校对规则。



是否对你有帮助?