2015-10-13 90 views
0

首先讓我告訴你,我使用的字符集和排序規則是utf8_general_ci。如何將拉丁字符轉換爲MySql中相應的unicode轉義序列?

爲了舉例,我有兩個表A和B.

表A有一列(我們稱之爲'columnX')。在表格的任何一行中,columnX可能有一個包含拉丁字符的值,例如'niño'(表示英文中的'boy')。

表B有一列(我們稱之爲'columnY'),我知道它可能包含'niño'作爲其價值的一部分,例如'es unniñobueno'(他是英語中的一個好孩子) ,但'ñ'將被轉義,因爲我知道columnY包含JSON字符串,所以字符串字面量將被編碼爲'es un ni'bueno'。

我需要查找表A的列A.columnX包含在任何B.columnY中的所有行。我需要一個函數將al A.columnX轉換爲相應的轉義版本。沿着下面的代碼的東西線:

SELECT * FROM A 
INNER JOIN B 
    ON B.columnY LIKE CONCAT('%', escapeUtf8(A.columnX) ,'%') 

我一直在使用QUOTECONVERTCAST嘗試也網上搜尋了很多,但所有我發現是相反的是什麼,我需要(帖子解釋瞭如何將轉義序列轉換爲人類可讀的內容)。

由於提前,

Adrián 
+0

凹凸!有沒有人知道至少存在這樣的功能?謝謝:) – SheikStack

+0

哦!此外,一個unescape函數將工作,如果我反向'LIKE'比較 – SheikStack

回答

0

我找到了一個解決辦法

我所做的就是用我發現這裏的STRINGDECODE功能(看喬尼的回答):MySQL decode Unicode to UTF-8 function,我用它來「反向」查詢。

我沒有使用表A中的「ñ」(或重音字母等)轉義列,而是使用STRINGDECODE轉義表B中的轉義列。另外,由於我需要多次使用解碼列值,因此我將B.columnY存儲在臨時表中(當然,在應用了STRINGDECODE之後)以供以後使用。這將是示例代碼:

CREATE TEMPORARY TABLE sanitizedB 
SELECT STRINGDECODE(columnY) as sanitizedColumnY, columnZ 
FROM B; 

SELECT * FROM A 
INNER JOIN sanitizedB SB 
    ON SB.sanitizedColumnY LIKE CONCAT('%', A.columnX ,'%') 

當然,我添加了其他列,我也需要以供將來使用。

值得一提的是,B表的記錄少於10,000條,所以創建臨時表的速度非常快......可能不是最好的解決方案,但對我來說效果不錯。

0

你應該存儲ñ如在UTF8柱六角C3B1。通過檢查SELECT HEX(col) ...。如果是&...;(有大約3種可能的方式來表示「html實體」),那麼你應該在文本INSERTing中修復一個混亂。

escapeUtf8()只會使情況複雜化;那裏不需要任何功能。

+0

感謝里克你的答案。我遇到的一個問題是,我無法控制數據的存儲方式,因爲它是第三方WordPress插件。 – SheikStack

+0

這裏是我的完整評論(那些5分鐘的編輯限制我們有評論....): 感謝里克你的答案。我遇到的一個問題是,我無法控制數據的存儲方式,因爲它是第三方WordPress插件。我所做的就是使用我在這裏找到的STRINGDECODE函數(查看Joni的答案):[link] http://stackoverflow.com/questions/11062330/mysql-decode-unicode-to-utf-8-function)和我「扭轉」了這個過程。我沒有使用表A中的「ñ」(或重音字母等)轉義列,而是使用STRINGDECODE轉義表B中的轉義列。 – SheikStack

相關問題