解決 KH Coder 遇到 MySQL 錯誤: error in your SQL syntax. SQL Caller: mysql_exec.pm line 377

KH Coder 是量化內容分析 (quantitative content analysis) 或文字探勘 (text mining) 的免費軟體。設定停用字 (stop words) 時,要載入文字檔案卻遇到 MySQL 錯誤「Failed in accessing MySQL database system. ... You have an error in your SQL syntax. ... SQL Caller: mysql_exec.pm line 377」。解決方式是修改特殊符號「單引號 (')」、「反斜線 (\)」前加上反斜線即可解決問題。

Co-occurrence Network of Words (來源)

更新:

重新下載安裝新版 KH Coder (Version 3.Alpha.17h 或之後的最新版本) 即可解決問題 (2019/10/09 更新,程式碼 commit 紀錄)

問題狀況:

(1) 選單 Select Word to Analyze --> force Ignore (挑選停用字) --> Read from a file

(2) 選定檔案,遇到以下錯誤訊息
Failed in accessing MySQL database system. KH Coder will exit now.
SQL Input:
UPDATE genkei SET nouse=1 WHERE name='''
Error:
You have an error in your SQL syntax. ... SQL Caller: line
... mysql_exec.pm line 377

按確定按鈕後,KH Coder 自動關閉。

(3) 如果不從檔案載入,而是直接將檔案內容貼到文字輸入方框

(4) 同樣顯示 MySQL 錯誤

解決方式

(1) 由於軟體作者執行的 MySQL 查詢指令,是組裝關鍵字成 SQL 查詢條件,並沒有將特殊符號跳脫 (escape),導致發生 SQL 查詢錯誤。

(2) 需要跳脫的完整特殊符號清單 (參考網頁 mysql_real_escape_string)
\x00
\n
\r
\
'
"
\x1a
從螢幕截圖知道軟體作者使用單引號作為欄位值的分隔符號,所以雙引號反而不用額外處理。其他特殊符號沒有用到就忽略。主要會需要處理的特殊符號是反斜線與單引號:
\
'

跳脫 (escape) 修改的方式是,在每行特殊符號前再加上反斜線
\\
\'
即可順利解決


錯誤的嘗試

(1) 根據錯誤訊息「UPDATE genkei SET nouse=1 WHERE name='''」原以為是不允許空值。但是其實跟空值沒有相關

觀察 KH Coder 儲存停用字到資料表 genkei (意思是規則 pattern),同時使用欄位 name 儲存詞彙,nouse (推測是 no use) 欄位值設定為 0


(2) 部分資料庫設定不允許特殊符號,但是查詢資料庫設定「定序」(Collation) 使用「utf8mb4_general_ci」,確認也不是這個問題

軟體版本

KH Coder Version 3.Alpha.11c [Perl 5.14.2, Perl/Tk 804.03]

參考資料



留言