我有一个SQL表,其中包含书籍的标题和作者姓名,所有标题和作者必须是唯一的,这意味着不允许重复。
但我有问题,如果我将输入作者A.K. Pathak
和A K Pathak
...两者都是相同的,但SQL将它们视为不同,如果我将输入标题为“very hungry caterpillar
”和“the very hungry caterpillar
”两者都相同,但SQL正在采取与众不同。
是否有任何PHP函数来解决这个或任何js函数?
字符串
A.K. Pathak
vsA K Pathak
和very hungry caterpillar
vsthe very hungry caterpillar
它们的含义是相同的但它们在字面上是不同的字符串,即使用不同的字母。 这就是数据库将它们视为相同字符串的原因。
确认输入
如果你需要保持它们的独特性,你必须在从用户输入接受字符串之前使用validation
。
客户端 因此,如果这些字符串被写下并由用户提交,您可以添加自动完成输入,这将有助于通过已使用术语的建议进行验证。
服务器端 通过正则表达式检查值,该正则表达式将忽略最常见的差异,如点,逗号,空格,a /等,并将新字符串与您已在数据库中的字符串进行比较。我建议保留两个字符串,即原始字符串,在同一个表中验证一个字符串,以便将来进行比较和重用。
如果你可以匹配标题之外的其他字段,比如一些独特的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%准确,仅作为绝望解决方案推荐。