Ruby on rails &引用;U+;2010年&引用-&引用;(或:使用Rails和Postgresql处理复制/粘贴的unicode字符)

Ruby on rails &引用;U+;2010年&引用-&引用;(或:使用Rails和Postgresql处理复制/粘贴的unicode字符),ruby-on-rails,postgresql,unicode,Ruby On Rails,Postgresql,Unicode,我有一个用postgresql 9.3支持的Rails 3.2/Ruby 2.0应用程序 人们将“PS-3002S-BK”等字符串复制/粘贴到web表单中。连字符为“U+2010”。数据以utf-8的形式保存到postgresql 然后,当他们搜索“PS-3002S-BK”(使用ascii连字符)时,不会返回任何数据,因为“PS-3002S-BK”!=“PS-3002S-BK” 处理此问题的最佳方法是什么?如果您使用定义正确的格式(例如序列号或型号等)将数据保存到列中,则在将数据保存到数据库之前

我有一个用postgresql 9.3支持的Rails 3.2/Ruby 2.0应用程序

人们将“PS-3002S-BK”等字符串复制/粘贴到web表单中。连字符为“U+2010”。数据以utf-8的形式保存到postgresql

然后,当他们搜索“PS-3002S-BK”(使用ascii连字符)时,不会返回任何数据,因为“PS-3002S-BK”!=“PS-3002S-BK”


处理此问题的最佳方法是什么?

如果您使用定义正确的格式(例如序列号或型号等)将数据保存到列中,则在将数据保存到数据库之前,请始终使用web应用程序将常见类型(U+2010、U+2011)或(U+2012、U+2013、U+2014、U+2015)转换为ASCII负数。最好在这种类型的列中不允许ASCII以外的任何内容

此外,当您在这个定义良好的格式列中搜索时,请始终将连字符和破折号转换为ASCII减号


如果因为在诸如注释等普通文本中搜索而不可能,则应将搜索字符串“PS-3002S-BK”拆分为单词,并搜索“PS”+“3002S”+“BK”。

因此,基本上只需编写将unicode连字符替换为ascii连字符的规则即可。@JoeVanDyk Yes,并在数据库中添加一个
CHECK
约束,该约束使用ascii连字符拒绝不符合预期模式的数据。让您的应用程序提前检查相同的内容,如果用户无法确定如何修复输入,则向用户提供一条信息性错误消息。。。。虽然您可以使用
进行搜索,如“PS\u 3002S\u BK”
,其中
\u
一个字符通配符,但性能会很差,因为它不能使用任何超过前缀的索引
PS
。所以规范化数据要好得多。@JoeVanDyk:不要写规则。永远不要在Postgres中使用规则。规则是邪恶的。写触发器。所谓规则,我指的是“逻辑”,而不是postgresql规则