我用PHP创建了一个脚本,基本上将带有名字的CSV(外部生成)上传到MySQL数据库,然后使用外部API处理每一行以确定名字是来自男性还是女性。
一旦评估了每一行(名称),它就会将名称存储在辅助表上(存在名称或缺失,具体取决于结果)。
为了避免浪费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的帮助下评估的一组新行。
我的DB和我所有的表都有这个值作为Collation:utf8_unicode_ci,但我得到了奇怪的结果,因为像"A LUIGI"这样的名称在两个表中都有不同的长度:名称列表中的"8"和现有表中的"7"。
因此,上面的查询返回了大量已经评估过的名称。
两个问题:1.在这种情况下,我应该如何构造查询以标准化排序规则?2.我应该在PHP脚本中添加哪些代码,以避免用不同排序规则的字符串填充DB?
谢谢你抽出时间。
垃圾进,垃圾出。您可能在其中一个表的"A LUIGI"中有多余的空间。要调试它,请执行
SELECT name, LENGTH(name), CHAR_LENGTH(name), HEX(name)
FROM ...
WHERE name LIKE '%LUIGI%';
每个表。
对于7个字符的版本,我希望两个长度都是7,HEX都是
41204C55494749
。如果在开头或结尾有一个额外的
20
,那么在插入文本时应该使用TRIM
。如果中间有一个额外的
20
,那就是另一个GIGO情况。如果
CHAR_LENGTH
是7,但LENGTH
是8,那么我们需要查看HEX,看看某个utf8字符是否是英语/意大利语字母。
一旦你有了两个字符串的HEX,我们就可以讨论"排序规则"问题了。