我發現mysql的很奇怪的行爲。 的選擇如下返回0:在mysql中匹配正則表達式中的十六進制字符
SELECT CONVERT('a' USING BINARY) REGEXP '[\x61]'
但是語義相同下面選擇返回1:
SELECT CONVERT('a' USING BINARY) REGEXP '[\x61-\x61]'
你知道這裏發生了什麼? 我測試過在mysql 5.0.0.3031和4.1.22中
我需要十六進制字符來創建一個正則表達式,當二進制字符串在utf8中被編碼時匹配。這種正則表達式的perl版本可以在w3c site上找到。它看起來如下:
$field =~
m/\A(
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*\z/x;
我刪除了'utf-8'標籤,因爲這個問題純粹是關於MySQL的正則表達式的。您的其他問題是處理UTF-8方面的問題:http://stackoverflow.com/questions/2199825/how-can-i-check-if-a-binary-string-is-utf-8-in -mysql – 2010-02-04 21:00:59