2011-08-01 51 views
1

我有來自Twitter的UTF-8文本數據(所以我很髒)。當輸入到mysql(數據庫字符集是utf8)時,一些文本會被垃圾回收。我想辦法把它在之前清理數據。如何清理MySQL的UTF-8數據

Insert ignore search_tweets set id_str = 'pass1',text = 'RT @youpon_info: Youponです!この度はキャンペーン參加ありがとうございました。たくさんの方々にキャンペーンに參加して頂きました。' ; 
Insert ignore search_tweets set id_str = 'fail',text = 'RT @youpon_info: Youponです!この度はキャンペーン參加ありがとうございました。たくさんの方々にキャンペーンに參加して頂きました。また次のキャンペーンをすぐに予定しております!もう少' ; 
Insert ignore search_tweets set id_str = 'pass2',text = 'また次のキャンペーンをすぐに予定しております!もう少' ; 

fail.text = pass1.text + pass2.text,他們都進去來的MySQL的罰款了。失敗出來

RT @youpon_info: Youponã§ãï¼ãã®åº¦ã¯ã­ã£ã³ãã¼ã³åå ãããã¨ããããã¾ãããããããã®æ¹ã

我已經做了這個直接的MySQL調用,雖然最初它都是在Ruby數據映射器和直接調用完成。

我想知道如何清理數據,以便它進出MySQL的相同。如果可能的話,一個紅寶石解決方案會很好,但只要知道如何清理它就會很好。

回答

3

它看起來像被截斷的數據。 text列中是否有足夠空間存儲您要插入的數據?

我懷疑varchar(n)只接受n個字節,而不是n個字符,日文字符各佔3個字節。 Mysql以默認截斷不適合的數據而聞名,如果恰好在UTF-8字符中間被截斷,讀者可能會認爲它不正確的UTF-8並將其解釋爲ISO8859-1,這會導致在你看到的。

請注意,在UTF-8中,生動語言的所有字符都適合3個字節(中文,日文和韓文都在那些總是需要3個字符的文本中),擴展符號和歷史腳本需要4個字節。所以爲了保持安全,數據庫必須願意接受4倍於允許字符數的字節數。

+0

我有varchar(255)所以增加到511足夠的3字節沒有運氣,但在1023 - 4字節每個可能的字符(推文是最多140字符)它工作的感謝。 –

+0

@ Grant M:我相信我在'net'上看到過一些食譜,如何讓MySQL失敗而不是默默地篡改數據。可能值得在您的項目中尋找幷包括一個以避免這種意外(有很多情況下,默認行爲是截斷/剪切/轉換數據)。 –

+0

請注意,推文現在可達280個字符。 –