2016-05-16 54 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,我們可以討論'整理'問題。