標籤:int 建立表 gpo img bubuko name ica 大小寫 arc
在《Python資料採礦-概念、方法與實踐》一書的第3章實體匹配中,如果一路按照作者的代碼及SQL語句進行配置啟動並執行話,會出現如題目所示的錯誤。根據python指令碼的執行錯誤提示顯示,錯誤發生在指令碼中的第一個INSERT INTO語句中。
其實並不是到插入roxml時候才會報錯,而是在前面插入optionparser的時候就已經報錯了。這個錯誤意思是代碼試圖在表中主鍵列被插入兩個重複值。這個問題耗費了我三個小時,才最終把它解決。
書中的第一個INSERT語句目的是要把具有相同URL的項目的項目名稱插入到book_entity_matches表中,在來自RF和RG的兩個網站的項目裡面,有一些項目,它們的名字是僅有大小寫區別的,如下:
上兩圖中分別是從RF和RG表中查詢出來的結果,可以看到,的確是存在項目名稱只有大小寫區別的項目。但由於MySQL預設它的VARCHAR欄位是不區分大小寫,所以在執行INSERT INTO語句當嘗試插入如所示的兩個相同的(只有大小寫區別)項目名稱時,就出現了錯誤!
解決方案之一,就是把這兩個欄位類型更改為BINARY:
ALTER TABLE book_entity_matches MODIFY COLUMN rg_project_name VARCHAR(100) BINARY NOT NULL;ALTER TABLE book_entity_matches MODIFY COLUMN rf_project_name VARCHAR(100) BINARY NOT NULL;
其它的方法有:在建立表時指定欄位屬性為BINARY,或者在建立表時指定編碼類別型,類型尾碼為cs(如utf8_general_cs)的即是區分大小寫,為ci(如utf8_general_ci)的即不區分。
參考:
- MySql 設定欄位值區分大小寫
- MySQL大小寫敏感說明
pymysql.err.IntegrityError: (1062, "Duplicate entry 'roxml-ROXML' for key 'PRIMARY'")