相同的字符串比较不工作mysql

时间:2016-05-16 17:35:25

标签: php mysql collation string-comparison

我在PHP中创建了一个脚本,它基本上将带有名字的CSV(外部生成)上传到MySQL数据库,然后处理每一行以确定名字是来自使用外部API的男性还是女性。

一旦评估了每一行(名称),它就会将名称存储在辅助表中(existing_names或缺少取决于结果)。

为避免浪费我的API请求并加快处理速度,每次上传CSV时,都会运行以下查询以确定表中是否已存在名称。

SELECT DISTINCT nl.name 
FROM namelist nl 
LEFT JOIN (
    SELECT name 
    FROM missing 
    UNION 
    SELECT name 
    FROM existing_names 
    ) en ON en.name = nl.name 
WHERE en.name IS NULL

从这个查询中,我获得了将在API的帮助下评估的新行集。

我的数据库和我的所有表都有这个值作为校对:utf8_unicode_ci但是我得到了奇怪的结果,如#34; A LUIGI"两个表都有不同的长度:' 8'在名单和' 7'现有的。

因此,上面的查询返回了大量已经评估过的名称。

两个问题: 1.在这种情况下,我应该如何构建查询以标准化排序规则? 2.我应该将哪些代码添加到我的PHP脚本中,以避免使用具有不同排序规则的字符串填充数据库?

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

垃圾进,垃圾出你可能在" A LUIGI"在其中一个表中。要调试它,请执行

SELECT name, LENGTH(name), CHAR_LENGTH(name), HEX(name)
    FROM ...
    WHERE name LIKE '%LUIGI%';

每张桌子。

  • 对于7-char版本,我希望两个长度都是7,HEX是41204C55494749

  • 如果在开头或结尾有额外的20,那么在插入文字时应该使用TRIM

  • 如果中间有一个额外的20,那就是另一个GIGO案例。

  • 如果CHAR_LENGTH为7但LENGTH为8,那么我们需要查看十六进制以查看某个utf8字符是否是英文/意大利字母的睫毛膏。

一旦你有两个字符串的HEX,我们就可以讨论'整理'的问题。