2022年能否在PostgreSQL中创建ICU排序规则数据库?Rails适配疑问
PostgreSQL ICU排序规则在Rails 7中的配置问题解决
关于CREATE DATABASE使用ICU排序规则的限制
PostgreSQL 11确实不支持在数据库级别(执行CREATE DATABASE时)直接指定ICU排序规则,这个限制在2022年对于11版本来说依然存在。如果升级到PostgreSQL 12及以上版本,该限制就被取消了,可直接在数据库级别配置ICU排序规则。
报错原因
你在database.yml中直接配置ctype: ja-x-icu和collation: ja-x-icu后报错,本质是PostgreSQL 11不允许将ICU排序规则设为数据库的默认字符分类和排序规则。
解决方案
方案1:保留PostgreSQL 11(列/索引级别配置)
只能在字段或索引层面单独指定ICU排序规则:
- 创建新表时指定字段的ICU排序规则:
# 迁移文件示例 class CreateSomeTable < ActiveRecord::Migration[7.0] def change create_table :some_table do |t| t.string :name, collation: 'ja-x-icu' t.text :description, collation: 'ja-x-icu' end end end - 修改已有字段的排序规则:
class UpdateNameCollation < ActiveRecord::Migration[7.0] def change change_column :some_table, :name, :string, collation: 'ja-x-icu' end end - 创建带ICU排序规则的索引(用于优化按ICU排序的查询):
class AddIndexToSomeTableName < ActiveRecord::Migration[7.0] def change add_index :some_table, :name, collation: 'ja-x-icu' end end
方案2:升级到PostgreSQL 12+(数据库级别配置,推荐)
升级后可直接在数据库级别配置ICU排序规则,步骤如下:
- 确保PostgreSQL已安装ICU扩展(多数发行版默认包含,若缺失可安装对应系统包,如Ubuntu的
postgresql-XX-icu,XX为你的PostgreSQL版本号) - 验证ICU排序规则是否可用:
在PostgreSQL控制台执行:
返回结果则说明规则已存在。SELECT * FROM pg_collation WHERE collname LIKE '%ja-x-icu%'; - 配置
database.yml:
需指定使用template0模板(避免继承template1的默认locale):default: &default adapter: postgresql ctype: ja-x-icu collation: ja-x-icu template: template0 - 若手动创建数据库,执行以下SQL:
CREATE DATABASE your_app_name WITH ENCODING 'UTF8' LC_COLLATE 'ja-x-icu' LC_CTYPE 'ja-x-icu' TEMPLATE template0;
内容的提问来源于stack exchange,提问作者user16012143
相关产品推荐
相关产品推荐

