[SQL]奇怪的 Unicode

[SQL]奇怪的 Unicode

收到一個求助的問題,使用者表示資料庫可能是索引異常,因此下 SQL 撈不出想要的資料,因此提供他一些檢查資料庫狀態的語法,但使用之後發覺沒有辦法解決,於是就接手處理看了一下。在客戶端的事件檢視器和 Error Log 中沒有任何異常錯誤訊息,而客戶表示目前只知道只有一個特定的資料有異常,因此初步判斷應該不是 SQL Server 的問題,但資料庫看起來有資料就是撈不出來,

 

1. 客戶的資料庫會有類似以下的兩筆資料

image

 

2. 如果很簡單的用 SQL 去測試,語法如下:

select A1,COUNT(*) count from A
  group by A1

 

image

 

3.  一開始也以為自己眼睛花了,但想說不會是因為前後有一些特殊看不見的字碼所引起的,因此調整一下指令來測試

select A1,CAST( RTRIM(A1) AS VARBINARY ) binary 
  from A

 

image

 

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