[SQL]奇怪的 Unicode
收到一個求助的問題,使用者表示資料庫可能是索引異常,因此下 SQL 撈不出想要的資料,因此提供他一些檢查資料庫狀態的語法,但使用之後發覺沒有辦法解決,於是就接手處理看了一下。在客戶端的事件檢視器和 Error Log 中沒有任何異常錯誤訊息,而客戶表示目前只知道只有一個特定的資料有異常,因此初步判斷應該不是 SQL Server 的問題,但資料庫看起來有資料就是撈不出來,
1. 客戶的資料庫會有類似以下的兩筆資料
2. 如果很簡單的用 SQL 去測試,語法如下:
select A1,COUNT(*) count from A
group by A1
3. 一開始也以為自己眼睛花了,但想說不會是因為前後有一些特殊看不見的字碼所引起的,因此調整一下指令來測試
select A1,CAST( RTRIM(A1) AS VARBINARY ) binary
from A
4. 從上圖可以看到,看起來好像是相同的兩個字,其實他的內碼是不同的,因此查看一下 Unicode 這兩個字碼的資料,因為有 Low Byte 和 High Byte 排列的順序問題,因此要查編碼的時候要把在 SQL Server 內的前後順序對調一下:
正常的 : http://www.fileformat.info/info/unicode/char/6797/index.htm
異常的 : http://www.fileformat.info/info/unicode/char/F9F4/index.htm
5. F9F4 的那個字是屬於 CJK Compatibility Ideographs 內,正常來說不應該會去使用到那個範圍的內碼;但是跟使用者確認,可能早期不知道用甚麼樣的方式將資料匯入到資料庫內 ( 時代久遠已經不可考了 ),因為看起來都一樣也沒有特別問題,看使用者如果正常手動輸入資料的時候又找不到,才會誤以為是資料庫的問題。查了一下相關文章,有一篇對於CJK Compatibility Ideographs有比較多的描述,有興趣的人可以參考 http://chukaml.tripod.com/unicode/han/UF900.html