1

我在黑暗中尝试了许多随机拍摄,例如:

  config.gateways[:default] = [:sql, database_url, encoding: 'UTF8']

以及 UTF8 的所有变体,例如 utf8、utf-8、unicode、Unicode。

  • 我尝试将 shell env 的 LC_CTYPE 设置为 UTF8。
  • 我尝试在连接 URL 上设置 client_encoding 参数。
  • 我已经验证数据库具有 UTF8 编码,即SHOW server_encoding.
  • 我已经验证了 ROM 的 Sequel 连接在实际使用之前报告了 UTF8 的客户端编码,即SHOW client_encoding
  • 我已经验证我可以使用 psql 在同一个数据库中插入和读回 UTF-8 字符。
  • 我已经验证我可以使用 Rails 的 ActiveRecord 在同一个数据库中插入和读回 UTF-8 字符。

但是当我给 ROM 非 ASCII、UTF-8 字符插入时,这些字符在 PostgreSQL 的某个地方被替换为“�”。

设置 ROM 并将其与 UTF-8 字符一起使用的正确方法是什么?

4

1 回答 1

3

嗯,我们将连接选项直接传递给 Sequel,然后如果您在连接配置选项中指定编码:utf-8,它将起作用

ROM::Configuration.new(:sql, "postgres://...", { encoding: utf-8 })

require 'rom'
require 'rom-sql'

DATABASE_URL = ENV.fetch('DATABASE_URL', 'postgres://localhost/rom')
setup = ROM::Configuration.new(:sql, DATABASE_URL, encoding: 'unicode')
rom = ROM.container(setup)

conn = setup.default.connection
conn.drop_table?(:users)
conn.create_table :users do
  String :name
end

class Users < ROM::Relation[:sql]
end

setup.register_relation(:users)

rom.relations.users.insert(:name => "Pöter")

p rom.relations.users.to_a
于 2015-12-11T09:54:39.243 回答