You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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排序规则,步骤如下:

  1. 确保PostgreSQL已安装ICU扩展(多数发行版默认包含,若缺失可安装对应系统包,如Ubuntu的postgresql-XX-icu,XX为你的PostgreSQL版本号)
  2. 验证ICU排序规则是否可用:
    在PostgreSQL控制台执行:
    SELECT * FROM pg_collation WHERE collname LIKE '%ja-x-icu%';
    
    返回结果则说明规则已存在。
  3. 配置database.yml:
    需指定使用template0模板(避免继承template1的默认locale):
    default: &default
      adapter: postgresql
      ctype: ja-x-icu
      collation: ja-x-icu
      template: template0
    
  4. 若手动创建数据库,执行以下SQL:
    CREATE DATABASE your_app_name
      WITH ENCODING 'UTF8'
      LC_COLLATE 'ja-x-icu'
      LC_CTYPE 'ja-x-icu'
      TEMPLATE template0;
    

内容的提问来源于stack exchange,提问作者user16012143

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:18:10