NVARCHAR 比較大小是依照 ASCII 來比較
在看 Stored Procedure 的時候發現有一個判斷欄位是否有值的方式會造成若第一個字符是某些符號的時候會查不出資料。
產生測試的資料實驗
DROP TABLE IF EXISTS #tmpData;
CREATE TABLE #tmpData (
[Address] NVARCHAR(5) NULL
);
INSERT INTO #tmpData (Address)
values (N'{台北市'),
(N'台{北市'),
(N'台北市'),
(N'0'),
(N'');
判斷地址欄位是否有值
SELECT * FROM #tmpData WHERE ISNULL([Address], '') >= '0';
接著看到查詢結果竟然不包含地址內容第一個字是有符號的那筆地址。
根據 NVARCHAR 比較大小是從開頭的字符一個一個字符依照 ASCII 大小比較。
SELECT [Address] ,ASCII(SUBSTRING([Address],1,1)) FROM #tmpData
從結果看出來,難怪為什麼判斷式寫 「ISNULL([Address], '') >= '0'」會不如預期的顯示資訊。
參考資訊:
1. SQL SERVER ASCII