2014-01-20 28 views
7

我想在MySQL 5.1中選擇unicode字符/ u2028。 MySQL 5.1確實支持utf8和ucs2。在mysql中選擇unicode字符u2028 5.1

在MySQL的新版本,我可以選擇的字符只是使用UTF-16或UTF32歸類:

SELECT char(0x2028 using utf16); 
SELECT char(0x00002028 using utf32); 

但MySQL 5.1中不支持UTF-16和UTF32。我怎麼才能選擇unicode字符呢?

也許關於我的用例的幾句話:我有一個第三方應用程序,它將數據存儲在mysql數據庫中,並使用JavaScript進行用戶界面。該應用程序不處理問題unicode字符/ u2028和/ u2029是有效的JSON,但會破壞JavaScript代碼。 (有關詳細信息,請參閱http://timelessrepo.com/json-isnt-a-javascript-subset)所以我想知道有多少數據受該問題影響,並且可能在MySQL上使用替換來修復它。


爲了說明問題:

CREATE TABLE IF NOT EXISTS `test` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `string` varchar(100) CHARACTER SET utf8 NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; 

INSERT INTO `test` (`id`, `string`) VALUES 
(1, 'without U+2028'), 
(2, 'with U+2028 at this "
 "point'); 

SELECT * FROM test WHERE string LIKE CONCAT("%", char(0x2028 using utf16), "%"); 
// returns row 2 as expected 

SELECT * FROM test WHERE string LIKE CONCAT("%", char(??? using utf8), "%"); 
// U+2028 in utf8 is 0xE2 0x80 0xA8 isn't it? 
// But how to parse this to char function? 
+0

不太確定問題所在。 U + 2028是一個完美支持MySQL的'utf8'編碼的字符。但是,CHAR函數及其參數有點不同。爲什麼你想要將文字'0x2028'轉換爲UTF-8編碼的U + 2028 Unicode字符?這真的是你想解決的問題嗎? – deceze

+0

U + 2028 LINE SEPARATOR很少使用。你確定你需要處理它嗎?它可能會導致JavaScript中的問題,但這與MySQL有什麼關係? –

+2

@ JukkaK.Korpela正如我在我的使用案例中寫到的,我必須處理U + 2028和U + 2029,僅僅是因爲它們在JavaScript中引起的問題。由於前端的JavaScript問題,我需要刪除第三方應用程序的MySQL數據庫的這些字符。 – jelhan

回答

4

的Unicode字符U + 2028可以以UTF-8爲十六進制e280a8進行編碼。所以答案就是在MySQL中使用UNHEX函數來查找它。

SELECT * FROM test WHERE string LIKE CONCAT("%", UNHEX('e280a8'), "%"); 

MySQL 5.1只能處理以UTF-8封裝的字符長達三個字節。因此,使用UNHEX搜索U + 2028將起作用,但搜索U + 1F600不會佔用四個字節。

使用UNHEX('e280a9')搜索U + 2029。

+1

你在哪裏得到/計算U + 2028和e280a8之間的映射?我還有其他角色需要處理。 – Robert

+0

您可以使用以下URL,用'2028'代替您正在查找的字符。在「UTF-8(十六進制)」行中查找括號中的數字。 http://www.fileformat.info/info/unicode/char/2028/index.htm –

+0

非常感謝! – kalinma