我写了一个mysql查询
select * from table where name like '%salil%'
工作正常,但不会返回名为'sal-il'的记录,'sa @lil'。
所以我想要一个类似下面的查询
select * from table where
的 remove_special_character_from(名称) like '%salil%'
remove_special_character_from(name)是一个mysql方法或正则表达式,它在执行之前从名称中删除所有特殊字符。
答案 0 :(得分:1)
不,mysql不支持基于regexp的替换 我建议使用存储在单独字段中的搜索术语的规范化版本。
因此,在插入时,您从数据中删除所有非字母字符,并将其存储在data_norm
字段中以供将来搜索。
答案 1 :(得分:1)
由于我知道无法做到这一点,我会为此使用“计算列”,即一列取决于name
但没有特殊字符的值。这样,转换的成本只支付一次,您甚至可以在新列上创建索引。
请参阅this answer如何执行此操作。
答案 2 :(得分:1)
我同意Aaron和Col. Shrapnel您应该在表格中使用额外的列,例如search_name
用于存储名称的规范化版本。
我注意到这个问题最初被标记为ruby-on-rails。如果这是Rails应用程序的一部分,那么您可以使用before_save回调来设置此字段的值。
答案 3 :(得分:0)
在MYSQL 5.1中,您可以使用REGEXP
进行正常的表达式匹配,如此
SELECT * FROM foo WHERE bar REGEXP "baz"
请参阅http://dev.mysql.com/doc/refman/5.1/en/regexp.html
但是,请注意它将慢,您应该执行其他海报建议的操作,并将清洁值存储在单独的字段中。