比较字符串的含义,而不是内容

时间:2017-12-19 06:16:51

标签: php sql

我有一个SQL表,其中包含书籍的标题和作者姓名,所有标题和作者必须是唯一的,这意味着不允许重复。

但我有问题,如果我将作为A.K. PathakA K Pathak输入作者...两者都相同,但SQL将它们视为不同,如果我将输入标题为" very hungry caterpillar"和" the very hungry caterpillar"两者都是一样的,但SQL正在变得不同。

是否有任何PHP函数可以解决这个或任何js函数?

2 个答案:

答案 0 :(得分:1)

字符串

  

A.K. Pathak vs A K Pathak
  和
  very hungry caterpillar vs the very hungry caterpillar

是相同的意思但是字面意思是一个字符串,即使用不同的字母。
这就是数据库将它们视为相同字符串的原因。

验证输入
如果您需要保持它们的唯一性,则必须在从用户输入接受字符串之前使用validation

客户端
因此,如果这些字符串被写下并由用户提交,您可以添加自动完成输入,这将有助于通过建议已使用的术语进行验证。

服务器端
通过正则表达式检查值,该正则表达式将忽略最常见的差异,如点,逗号,空格,a /等,并将新字符串与您已在数据库中的字符串进行比较。我建议保留两个字符串,即原始字符串,在同一个表中对其进行验证,以便将来进行比较和重用。

答案 1 :(得分:0)

如果您可以通过标题以外的其他字段进行匹配,比如一些独特的ID或ISBN代码,那就更好了,但如果您需要按标题进行匹配,您可以尝试这样的疯狂:

SELECT * FROM books
WHERE regexp_replace(title, '[^a-zA-Z]', '', 'g') 
    ILIKE '%'|| regexp_replace('$my_search', '[^a-zA-Z]', '', 'g')||'%'
OR regexp_replace('$my_search', '[^a-zA-Z]', '', 'g') 
    ILIKE '%'|| regexp_replace(title, '[^a-zA-Z]', '', 'g')||'%'
OR regexp_replace(author, '[^a-zA-Z]', '', 'g') 
    ILIKE '%'|| regexp_replace('$my_search', '[^a-zA-Z]', '', 'g')||'%'
OR regexp_replace('$my_search', '[^a-zA-Z]', '', 'g') 
    ILIKE '%'|| regexp_replace(author, '[^a-zA-Z]', '', 'g')||'%'

但是这个解决方案 100%准确且建议作为绝望的解决方案。