所以我正在尝试使用 citext,但它似乎是来自 ubuntu 14.04 postgres 安装的 MIA。你在哪里可以找到这个名为 citext for postgresql 9.3 的神秘野兽?
project_test=> CREATE TABLE "customers_addresstype" (
project_test(> "id" serial NOT NULL PRIMARY KEY,
project_test(> "customer_id" integer NOT NULL REFERENCES "customers_customer" ("id") DEFERRABLE INITIALLY DEFERRED,
project_test(> "display" citext NOT NULL,
project_test(> UNIQUE ("customer_id", "display")
project_test(> )
project_test-> ;
ERROR: type "citext" does not exist
LINE 4: "display" citext NOT NULL,
^
project_test=> CREATE EXTENSION IF NOT EXISTS citext WITH SCHEMA ext;
ERROR: could not open extension control file "/usr/share/postgresql/9.3/extension/citext.control": No …
Run Code Online (Sandbox Code Playgroud) 就在最近,我从 Postgresql 8.4.11 升级到 9.1.3。我在这个过程中使用了 pg_dump。现在我收到一个错误:
错误:没有为可排序类型 citext 的列“vin”派生排序规则
提示:使用 COLLATE 子句显式设置排序规则。
这是我之前遇到的问题的延续。发行说明中建议的修复似乎没有捕获自定义域。似乎8.4 中的CREATE DOMAIN语句甚至不支持该COLLATE
子句。
这就是我创建vin
类型的方式,
CREATE DOMAIN inventory.valid_vin AS citext
CHECK ( inventory.valid_vin( VALUE ) );
Run Code Online (Sandbox Code Playgroud) 我在应用程序中的一个特别大的表上过度使用了 CITEXT 列。我想支持其中一些,因为如何触发所需索引的查找令人困惑。
我的问题是,我可以在不遇到任何重大困难的情况下做到这一点吗?如果我更改此设置,我是否需要重建这些字段上的任何索引?
朝这个方向发展会带来空间收益吗?
这些列不需要不区分大小写的查询。
我对该表进行了基于 2 列的计数,这些计数需要一个多小时。该表有 60 列。
我正在使用 Postgres 10.6。
我主要感兴趣的是,如果索引包含已从 CITEXT 更改为 VARCHAR 的列,是否需要重建索引。
正如预期的那样,当进行这样的相等测试时,比较成功:
CREATE TABLE citext_test (
value citext PRIMARY KEY
);
INSERT INTO citext_test VALUES ('one');
INSERT INTO citext_test VALUES ('two');
SELECT * FROM citext_test WHERE value = 'One';
Run Code Online (Sandbox Code Playgroud)
但是,如果要比较的值是“text”类型,则比较失败:
SELECT * FROM citext_test WHERE value = 'One'::text;
Run Code Online (Sandbox Code Playgroud)
使用 EXPLAIN,第一个示例中的原始值似乎被转换为 CITEXT:
Index Only Scan using citext_test_pkey on citext_test (cost=0.15..8.17 rows=1 width=32)
Index Cond: (value = 'One'::citext)
Run Code Online (Sandbox Code Playgroud)
我想与连接表中的 TEXT 列进行比较。我真的需要将这些列转换为 CITEXT 才能进行比较吗?我认为使用 CITEXT 的部分优点是不必记住添加这样的东西(例如 LOWER(some_value));