【问题标题】:Search working inappropriately if looking up for a string containing a pound symbol如果查找包含磅符号的字符串,则搜索工作不正常
【发布时间】:2014-04-28 11:18:45
【问题描述】:

我目前正在开发的应用程序具有搜索功能。在搜索特定字符串时,例如。 “4 for £3”匹配表行的特定列,搜索不会返回任何结果,尽管后端数据库已正确地将其存储为特定行的列中的值。

日志将搜索字符串作为“3 英镑的 4”传递。我不确定额外的 'Â' 字符是从哪里附加到我的搜索字符串(search_str)的。我尝试了以下解决方法来从后端搜索确切的字符串,但它似乎不起作用 -

解决方法 -

params[:search_str].include?('Â') ? params[:search_str].gsub!('£', '£') : 

另外,当我在 IRB 中尝试做同样的事情时,为了获得更多信息,我得到以下信息 -

irb(main):020:0> a = "2 for £7"
=> "2 for \302\2437"
irb(main):021:0>

irb(main):013:0> a.include?('Â')
=> true

在 Rails 中执行相同的命令时,从视图文件中单击的搜索按钮调用操作时返回 false。不知道为什么会出现这种异常行为,可能是因为 Rails 将“2 英镑 7”视为“2 英镑 7”而不是“2 英镑 302\2437”?

我验证了 '\302' 和 '\243' 是 this page 中给出的八进制等效项。我也确实看过similar question,但它似乎对我的情况没有帮助。

任何关于我如何解决这个问题的建议都会非常有帮助。

[更新问题]

database.yml 是 -

development:
  adapter: mysql
  database: db_name 
  username: 
  password: 
  host: localhost 

dev-rails:
  adapter: mysql
  database: 
  username: 
  password: 
  host: 
  port: 

dev-delayedjobs:
  development

test:
  adapter: mysql
  database: db_name
  username: 
  password:  
  host: 
  port:  

作为查询的一部分返回的结果 - show variables like 'char%';

character_set_client utf8

character_set_connection utf8

character_set_database latin1

character_set_filesystem 二进制文件

character_set_results utf8

character_set_server latin1

character_set_system utf8

character_sets_dir /app(.. 一些路径..)

谢谢。

【问题讨论】:

  • 您说数据库正确存储了值,但问题出在搜索上。 “得到”呢? (select * from MY_DB) - 那里的值正确吗?
  • 例如,如果我通过 mysql 工作台从 my_db 执行 sel *,它会返回正确的值。但是当我在浏览器网页中显示它时,在一个页面中它会适当地显示英镑符号,但在另一个页面中它会显示�符号而不是显示英镑符号。正确显示磅符号的位置具有以下代码和页面源 - <td> <a href="http://url" target="_blank">2 for £3</a> </td>。不能正常显示的地方有源码-<td width=150px>2 for �3</td>
  • 看起来您的数据库使用的是 UTF8,但 rails 使用的是 Latin1 或其他一些较小的字符集。您能否在您的问题中添加以下内容:1)进入 mysql 并输入 show variables like 'char%'; 2)您的 config/database.yaml 文件的内容(如果您使用它们,则减去密码)
  • @MaxWilliams - 感谢您的评论,问题已更新。
  • 您能否尝试将encoding: utf8 添加到您的config/database.yml 文件中的相关部分(developmentdev-rails,无论您使用的是哪个)。然后重新启动您的 Rails 服务器并再次尝试搜索。

标签: ruby-on-rails ruby encoding character-encoding pound


【解决方案1】:

听起来您的数据库将数据存储在 utf8 中,而 rails 正在使用不同的字符集(可能是 latin1)对其进行翻译。将此行添加到 config/database.yml 文件中的开发部分:

encoding: utf8

然后重新启动您的 Rails 服务器。

【讨论】:

  • 今天刚刚观察到,使用编码:database.yml 中的 utf8 .. '�' 被替换为 'ï¿1⁄2'。知道在这种情况下可以做什么以至少使用较早的编码。我目前无法取消编码:database.yml 中的 utf8 .. 因为它被用于系统中的搜索功能..
  • 这与我提出的另一个问题相似,该问题导致了相当长的对话。其中一张海报有步骤设置所有正确的选项,并转换所有现有数据,以全面正确使用 utf8。看看它是否有帮助 - stackoverflow.com/questions/22563225/…
  • 谢谢 Max,我们仍在寻找解决此问题的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2014-03-23
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多