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

如何在CircleCI的cimg/postgres镜像中为Rails应用启用ICU排序规则?

解决cimg/postgres:11.12中Rails应用启用ICU排序规则的问题

核心原因

PostgreSQL 11版本对ICU排序规则的支持仅局限于表/列级别,无法直接在数据库级设置ctype和collation为ja-x-icu——这是PostgreSQL 12及以上版本才具备的特性。你遇到的invalid locale name错误正是因为在11版本中尝试用数据库级ICU配置导致的。

解决方案

方案1:升级PostgreSQL镜像到12+版本(推荐)

这是最简洁的解决方式,因为PostgreSQL 12及以上原生支持数据库级ICU locale配置:

  1. 将CircleCI中的镜像替换为cimg/postgres:12.x或更高版本(例如cimg/postgres:12.17)
  2. 保留原有的database.yml配置:
    adapter: postgresql
    ctype: ja-x-icu
    collation: ja-x-icu
    
  3. 确认cimg/postgres镜像已编译ICU支持:该系列镜像从12版本开始默认通过--with-icu参数编译,无需额外配置。

方案2:在PostgreSQL 11中使用列级别ICU排序规则(无法升级时)

如果不能升级PostgreSQL版本,需调整为在表/列层面指定ICU排序规则:

  1. 修改database.yml,移除ctype和collation的数据库级配置,使用默认或兼容的locale:
    adapter: postgresql
    # 移除ctype和collation的全局配置
    
  2. 在Rails迁移文件中,为需要ICU排序的字段单独指定collation:
    • 添加新字段时:
      class AddJapaneseColumn < ActiveRecord::Migration[6.0]
        def change
          add_column :your_table, :japanese_text, :string, collation: 'ja-x-icu'
        end
      end
      
    • 修改现有字段时:
      class UpdateJapaneseColumnCollation < ActiveRecord::Migration[6.0]
        def change
          change_column :your_table, :japanese_text, :string, collation: 'ja-x-icu'
        end
      end
      
  3. 验证ICU排序规则存在:在CI的Postgres容器中执行SQL查询,确认ja-x-icu规则已存在:
    SELECT * FROM pg_collation WHERE collname = 'ja-x-icu';
    
    若不存在,可手动创建(cimg/postgres:11.12通常已预创建,此步骤为兜底):
    CREATE COLLATION "ja-x-icu" (provider = icu, locale = 'ja');
    

额外检查

确保CircleCI的Postgres容器启动时未设置冲突的locale环境变量(如LC_ALL),避免干扰数据库初始化时的locale配置。

内容的提问来源于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 12:30:55