2014-10-06 26 views
0

我看到奇怪的行爲與MySQL和非常高的UTF-8代碼點。與utf-8代碼點高的MySQL比較問題

幾個例子( - > \∪{1f48f}或\∪{1f48e}或其他任何東西了那個球場)

SELECT name, '', name = '', '' = '', name = '' from payees where id = 4178417368; 
+------+------+-------------+-----------+-----------+ 
| name | | name = '' | '' = '' | name = '' | 
+------+------+-------------+-----------+-----------+ 
|  | | 1   | 0   | 1   | 
+------+------+-------------+-----------+-----------+ 
1 rows in set (0.04 sec) 

注意平等已經成爲非傳遞:名稱等於空字符串,名稱等於隨機字符,但隨機字符不等於空字符串。

當然,這是一個相當舊的MySQL 5.1.68版本。有沒有人知道這在一般的新版本的MySQL 5.1或5.x中仍然存在?

回答

0

MySQL utf8字符集只支持基本多語言平面(BMP)中的字符。它不支持補充平面中的任何字符。

價:http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8.html

的MySQL的5.5.x引入utf8mb4字符集,其不支持4字節編碼; characteret的行爲保持不變。

http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html


從您發佈的東西,它看起來像存儲在該行的name列中的值是零長度字符串。 (您可以使用LENGTH(name),CHAR_LENGTH(name),HEX(name)函數更好地瞭解實際存儲的內容。

name列與空字符串以及不支持的字符看起來像他們應該返回1.

但是,兩個文字的比較結果返回0,我沒有真正期待。沒有列字符集涉及那裏,所以這將只是客戶端字符集我試圖在文字上使用LENGTH,CHAR_LENGTH和HEX函數

這些文字的比較結果是:1)記錄的行爲(記錄在某處),或者2)未定義的行爲,並且MySQL可以做任何事情,或者3)它是一個錯誤(即行爲偏離記錄的行爲。)

+0

是的,在這種情況下,名稱是零長度字符串。 – AndrewS 2014-10-07 01:18:47