【问题标题】:DB encoding mistake when i'm looking for a record查找记录时出现 DB 编码错误
【发布时间】:2015-04-24 08:50:10
【问题描述】:

我正在使用 ruby​​ 2.2.0 和 rails 4.2.0。

对于一个项目,我有一个名为“Character”的表,其中每条记录都是一个字符。例如,当我使用“where”搜索记录时,框架会在字符之间出现错误。

例如:

Basic.where(:character => 'Í')

返回所有带有我喜欢字符的记录:“Ï”,字符:“I”,字符:“i”,字符:“í”,字符:“ì”,...

我的数据库使用 utf8-general-ci 进行编码,当我将数据放入数据库时​​,我使用 'iso-8859-1:utf-8' 编码。

【问题讨论】:

  • 我认为有可能发生名称冲突...因为您的表名和属性名都相同...尝试更改并回复...
  • 我试试看。问题未解决

标签: mysql ruby-on-rails activerecord


【解决方案1】:

utf8_general_ci 有问题是用组合字符去除字符。简而言之,使用 utf8_unicode_ci,它使用 Unicode Collat​​ion Algorithm 而不是。这已经在What are the diffrences between utf8_general_ci and utf8_unicode_ci?中得到了很好的回答

编辑: 实际上似乎连utf8_unicode_ci 都没有正确处理这个问题。

这是我用来测试的代码

SET collation_connection = 'utf8_bin';
SELECT 'Ï' = 'I'; -- 0

SET collation_connection = 'utf8_unicode_ci';
SELECT 'Ï' = 'I'; -- 1

SET collation_connection = 'utf8_general_ci';
SELECT 'Ï' = 'I'; -- 1

SET collation_connection = 'utf8mb4_bin';
SELECT 'Ï' = 'I'; -- 0

SET collation_connection = 'utf8mb4_unicode_ci';
SELECT 'Ï' = 'I'; -- 1

SET collation_connection = 'utf8mb4_general_ci';
SELECT 'Ï' = 'I'; -- 1

EDIT2:

看起来 Postgres 处理得更好,http://sqlfiddle.com/#!15/9eecb/797。如果您可以控制数据库的选择,我建议您改用 Postgres

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 2014-08-21
    • 2015-11-29
    • 2020-04-07
    • 2015-08-28
    相关资源
    最近更新 更多