2016-05-16 24 views
2

我在PHP中创建了一个脚本,基本上将带有名字的CSV(外部生成)上传到MySQL数据库,然后处理每一行以确定名字是男性还是女性使用外部API。相同的字符串比较不工作mysql

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

为了避免浪费我的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,但我得到奇怪的结果,因为名称如“LUIGI”在两个表中都有不同的长度:名称列表中的'8'和现有的'7'。

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

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

谢谢你的时间。

+0

我不知道你的问题的答案,但出于兴趣,你将如何处理像“查理”,“杰米”,“杰西”,“河”等男女皆宜的名字?如何用一种语言表示男性,而另一种语言表示女性(例如“Jean”)?尽管我不知道你的系统是做什么的,它是否需要并且能够巧妙地与变性人用户打交道? –

+0

@MattRaines我将它用于拉丁美洲的名字,至少在西班牙语中,只有几个名字可以是男女皆宜的,大部分时间由两个名字组成,其中第一个名字定义了性别。 (恩。“Jose Maria”,“Jose Guadalupe”)至少在这个项目中,性别将仅用于分析目的,我们不会用它来向用户发送任何通信。 – miguelvalenciav

回答

2

垃圾进出垃圾。您可能在其中一个表中的“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字符是否是作为英语/意大利语字母的mascaraing。

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