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

问题描述 投票:0回答:2

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

但我有问题,如果我将输入作者A.K. PathakA K Pathak ...两者都是相同的,但SQL将它们视为不同,如果我将输入标题为“very hungry caterpillar”和“the very hungry caterpillar”两者都相同,但SQL正在采取与众不同。

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

php sql
2个回答
1
投票

字符串

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

它们的含义是相同的但它们在字面上是不同的字符串,即使用不同的字母。 这就是数据库将它们视为相同字符串的原因。

确认输入 如果你需要保持它们的独特性,你必须在从用户输入接受字符串之前使用validation

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

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


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%准确,仅作为绝望解决方案推荐。

© www.soinside.com 2019 - 2024. All rights reserved.