2013-04-03 35 views
0

垃圾郵件的戰鬥中,我發現了一些保存垃圾評論沒有任何內容...的Mysql無法保存UTF串在某些情況下

試圖找出問題後,這裏是我一直保存到類似的評論後發現,隨着MySQL的數據庫文件...

這是(因爲未知輸入編碼的HEX)有何評論前幾個「字符」的樣子:

D1EA E0F7 E0F2 FC20 EFEE EFF3 EBFF F0ED FBE5 20EF F0EE E3F0 E0EC ECFB 

執行INSERT INTO test VALUES (0xD1EAE0F7E0F2FC20EFEEEFF3EBFFF0EDFBE520EFF0EEE3F0E0ECECFB21),(0x21D1EAE0F7E0F2FC20EFEEEFF3EBFFF0EDFBE520EFF0EEE3F0E0ECECFB), (0x21)測試MySQL表(UTF-8後)包含3行,首先沒有任何文字,第二和第三個單個字符「!」作爲文本...(注意21「十六進制代碼」也是在第一次輸入的結尾,但它不會被保存)。 (latin1編碼保存了一些無用的文本替換爲每個字節,但這篇文章是不是關於它)

當然,D1EA(D = 1101 0001應該後面跟着一個10xxxxxx字節,而不是1110xxxx)是無效的UTF- 8字符,但像數據庫服務器的健壯的系統應該能夠處理它...

我的猜測是,Mysql(版本5.1.66-0 + squeeze1)不應該選擇何時保存數據,何時不,即使它不是有效的UTF-8編碼字符......或者至少,它不應該聲稱當它決定不存儲數據時查詢成功!

是在mysql中的bug,還是什麼?

感謝

回答

1

編碼爲Windows-1251,並用它做任何事情之前解碼爲

Скачать популярные программы 
//"Download popular software" google translated 

您應該拒絕在你的代碼的非UTF8輸入。

if(!mb_check_encoding($input, "UTF-8")) { 
    header("HTTP/1.1 400 Bad Request"); 
    die("Invalid encoding"); 
} 

FTR,您的查詢是十六進制文字,而不是錯誤編碼的文本。

+0

謝謝你,我會用這個接口來防止這樣的垃圾評論...問題與MySQL不保存數據聲稱它被成功保存,但是,仍然存在,這是不通用的解決方案 – tomas

+0

@tomas你是什麼意思不通用? – Esailija

+0

您必須修改每個系統以檢查請求編碼。但是,每個系統都已經檢查了mysql查詢的結果,所以它應該是mysql告訴「不,這個數據還沒有被保存」insted的「OK,繼續」... – tomas