2012-05-17 51 views
0
  1. 我想在包含阿拉伯文本數據的LONGBLOB字段上執行搜索。例如,你如何搜索「هذه«الأولوياتالدواوينية»ف」?Mysql在包含阿拉伯文本數據的longblob db字段上搜索

    表字段的值爲3313537353B2623313630363B2623313631303B202623313630343B2623313537353B2623313630363B202623313539303B2623313538313B2623313537353B2623313631303B2623313537353B2623313630373B2623313630353B2026;但是,如果我檢索阿拉伯文本值並顯示在網頁上,則會顯示正確的阿拉伯字符。

  2. 如果我將字段的數據類型從LONGBLOB更改爲LONGTEXT,它會影響我存儲的阿拉伯語內容文本嗎?我在該表中有近1500條記錄。

回答

1
  1. 瞭解一個字符及其編碼之間的區別是很重要的。例如字符ن將以非常不同的字節depending on its encoding存儲。例如,如果使用IBM1097代碼頁編碼,它將由單個字節0xcc表示,但是如果使用UTF-16編碼,則使用四個字節序列0xfefffee5。更糟的是,相同字符可以用相同的編碼中的多種方式表示。

    除非MySQL知道使用了哪種編碼,否則它將無法執行所需排序的文本比較(儘管它可以執行二進制搜索相同的字節序列,但這不適用於您所需的排序規則 —即比較字符串的方式,例如不區分大小寫,或表示相同字符的不同字節序列)。

    因此,您必須在執行搜索時將編碼信息提供給MySQL,或讓MySQL從它首次接收數據的那一刻開始跟蹤它(即將數據存儲在字符串類型的列中而不是二進制類型)。

    它是很多更通常的(而且我強烈建議你)將文本數據存儲在字符串類型的列中。 LONGTEXT是一種可能性,但可能會滿足您的需求:它可以存儲高達4GiB的數據!也許TEXTVARCHAR(可以同時容納64KiB)或MEDIUMTEXT(最高16MiB)更合適?

    一旦理解爲字符數據,MySQL可以使用其String Comparison FunctionsRegular Expressions簡單地搜索文本。例如:

    SELECT * FROM mytable WHERE textcolumn LIKE '%هذه «الأولويات الدواوينية» ف%'; 
    

    這將搜索mytable對於其textcolumn字段包含(根據其整理)指定的字符串內的任何地方的任何記錄。

  2. 您必須先了解LONGBLOB列中存儲的現有數據的編碼(插入/更新數據時使用的任何編碼方式)。

    然後,您可以將其轉換爲沒有問題的字符串類型的列—,但請注意,如果記錄之間存在差異,則必須根據具體情況管理每條記錄的轉換(但您也可以無論如何,在檢索當前數據時都面臨同樣的問題)。例如,如果數據是使用UTF-8編碼,您可以將列轉換爲TEXT如下:

    ALTER TABLE mytable MODIFY textcolumn TEXT CHARACTER SET utf8; 
    

    注意,你必須確保你的connection character set正確配置爲您的客戶,以確保必要的發送/檢索字符串數據時發生轉換。

+0

我做了一個longblob db字段的表,最初更改爲longtext。並使用這個新表。搜索現在提供所需的結果。 – Parag

0

這裏是什麼,我看到你的兩個選項,可能的解決方案:

保持LONGBLOB:如果您要搜索文本的全部內容,你總是可以做一個MD5總和(或任何其他哈希算法...無論適用於您)在長波和搜索。你也可以索引這個MD5列,這樣你可以做超快速搜索,如果你把它做成longint或其他東西。

這種方法的一個問題是,你必須知道整個文本內容才能找到記錄。一種可能的解決方案是提供與表格中的記錄鏈接的主題令牌以及可以存儲在單獨的表格和搜索中的longblob。然後,您可以從longblob表中返回符合標記的行。一個例子是,如果你有一些關於電影,劇院,評論家和演員的文字,你會爲「電影」,「戲劇」,「評論家」和「演員」創建令牌,將它們存儲在令牌表中包含文章的longblob表條目的外鍵,然後當用戶搜索「電影」和/或「評論」等時,您將返回longblob表中的那一行,因爲它匹配那些特定的標記。這應該仍然讓你快速搜索。

更改爲長文本:如果您轉換爲使用長文本,它會爲您提供更好的搜索功能(但速度較慢),因爲您可以在其中進行搜索。如果是我,我會創建一個新表格,其中包含longtext作爲主字段的類型,並編寫一個腳本,將blob中的阿拉伯數據讀出,然後將其作爲文本寫入新表格。如果你確定你的格式是正確的,它不應該破壞你的數據。我不確定是否僅僅簡單地轉換它就會破壞它...你總是可以做一個測試用例,你用longblob製作一個表格,用一些阿拉伯文字填充它,然後將列轉換成長文本走着瞧吧。

+0

第一個選項的問題是排序規則無法應用:例如,對於不區分大小寫的情況或不同字節序列在相同編碼中表示相同字符的情況......因此我不會推薦這樣做。 – eggyal