0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

postgresqlで「PG::UndefinedObject: ERROR: collation "ja_JP.utf8" for encoding "UTF8" does not exist」が出るとき

Last updated at Posted at 2024-11-22

概要

本質的な原因や機構を正確に理解できていない状態で恐縮ですが、本エラーメッセージでGoogleやドキュメントを検索しても対策がみつからなかったため、どなたか(例:1週間前の自分)の助けになればと暫定対策ではありますが状況を共有します。

環境

Windows11 WSL2 Ubuntu 22.04.2 LTS
PostgreSQL 14.13 (Ubuntu 14.13-0ubuntu0.22.04.1)

現象

Railsにて、以下のようにカナでソートする際に以下のようにエラーが出現した。

> Product.order(Arel.sql('name_kana collate "ja_JP.utf8"')) 
>-> ActiveRecord::StatementInvalid - PG::UndefinedObject: ERROR:  collation "ja_JP.utf8" for encoding "UTF8" does not exist

データベースの設定は以下の通り

postgres=# SHOW LC_COLLATE; 
 lc_collate 
------------
 C.UTF-8

 postgres=# SELECT datname, datcollate, datctype FROM pg_database WHERE datname = 'database';
  datname   | datcollate | datctype 
------------+------------+----------
 database | C.UTF-8    | C.UTF-8

OSのlocaleは下記の通りで ja_JP.utf8 は追加されている

postgres@pc:/home/pc$ locale -a | grep utf
C.utf8
ja_JP.utf8

暫定対策

以下のようにdatabaseごとにcollationを作成すると問題は解消した。

\c database;
CREATE COLLATION "ja_JP.utf8" (LOCALE = 'ja_JP.UTF-8');

railsの場合、テストDBと開発用DBそれぞれに実行する必要があるので要注意

(しかしこの結果は # show all; とかにも反映されていないようだし、mysqlにはある show collation のようなものも postgresql にはないのでなにがどうなったかわからない・・・。)

関連記事

公式ドキュメント
https://www.postgresql.jp/document/14/html/sql-createcollation.html

こちらの方のgistを参照させていただきました
https://gist.github.com/upinetree/9f643d02bdb8d245b66c

postgresのcollationについて概説
https://kiririmode.hatenablog.jp/entry/20230528/1685254374

0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?