我正在寻找记录时DB编码错误

时间:2015-04-24 08:50:10

标签: mysql ruby-on-rails activerecord

我使用的是ruby 2.2.0和rails 4.2.0。

对于一个项目,我有一个表calles'Character',其中每个记录都是一个字符。当我在搜索带有'where'的记录时,例如框架在字符之间做错了。

例如:

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

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

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

1 个答案:

答案 0 :(得分:0)

utf8_general_ci有问题是它用字符组合来删除字符。简而言之,使用Unicode归类算法而不是utf8_unicode_ci。在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。如果您可以控制DB的选择,我建议使用Postgres