我有一个SQL表,其中包含书籍的标题和作者姓名,所有标题和作者必须是唯一的,这意味着不允许重复。
但我有问题,如果我将作为A.K. Pathak
和A K Pathak
输入作者...两者都相同,但SQL将它们视为不同,如果我将输入标题为" very hungry caterpillar
"和" the very hungry caterpillar
"两者都是一样的,但SQL正在变得不同。
是否有任何PHP函数可以解决这个或任何js函数?
答案 0 :(得分:1)
字符串
A.K. Pathak
vsA K Pathak
和
very hungry caterpillar
vsthe 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%准确且仅建议作为绝望的解决方案。