索引列上的 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 (将#修改为@)