我在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脚本中,以避免使用具有不同排序规则的字符串填充数据库?
感谢您的时间。
答案 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,我们就可以讨论'整理'的问题。