微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

索引列上的 VARCHAR 比较

如何解决索引列上的 VARCHAR 比较

Postgres 的行为与“常识”预期行为不同:

给定一个表“my_table”和一个名为“MyVarcharColumn”的 VARCHAR(250) 列,其中基于“MyVarcharColumn”创建索引 IDX_MyvarcharColumn。

Collation: Default
Postgres version: 11.12
LC_COLLATE: en_US.utf8
Enconding: UTF8
CTYPE: en_US.utf8

问题如下:

给定一个查询 (A)

SELECT * FROM my_table t
WHERE 'mystring' = t.MyVarcharColumn

运行上述查询时,即使“my_table”中存在值“mystring”,也不会返回任何记录。

解决方法

SELECT * FROM my_table t
WHERE 'mystring' = t.MyVarcharColumn collate "C"

通过添加 'collat​​e "C"' 查询工作正常,显然没有人希望在每个查询的末尾添加 "collat​​e" 语句。

第二个“解决方法”:

通过重新创建数据库索引“REINDEX database myDB”,查询也开始按预期工作,无需添加语句“collat​​e”。

问题是:有没有办法避免使用 collat​​e 语句和/或 REINDEX 在没有解决方法的情况下完成这项工作?

  • 使用不同的排序规则重新创建数据库,目前也不是一种选择。
  • 使用lower(column_name) 进行比较不是一种选择,因为它不使用索引并且会使查询变慢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。