SQL Server 7.0 引入 Unicode、排序規則等國際化功能,SQL Server 2005 更支援欄位級排序規則。本文針對開發跨語言可攜式 T-SQL 程式碼的三大核心挑戰:日期處理、Unicode 字串、排序規則相依性,提供具體解決方案。
SET LANGUAGE us_english; SELECT DATEPART(dw, '20060606'); -- 返回 3 (週三)
SET LANGUAGE British; SELECT DATEPART(dw, '20060606'); -- 返回 2 (週二)
-- @@DATEFIRST 分別為 7 (美) 與 1 (英)
SET DATEFIRST 7 統一假設 (會覆蓋連線設定)@@DATEFIRST,使結果與語言無關
DECLARE @ndf_dw INT;
SET @ndf_dw = (@@DATEFIRST + DATEPART(dw, '20060606')) % 7;
-- @ndf_dw 在美/英環境下均返回相同值
DATENAME(dw, ...) 返回當地語言名稱 (如 Tuesday / Mardi)DATEPART、MONTH、DAY)| 方法 | 範例 | 說明 |
|---|---|---|
| ODBC 轉義子句 | {d '2006-06-06'}, {ts '2006-06-06 12:30:00'} | 伺服器端解析,不限 ODBC 應用 |
| ISO 8601 無分隔 | '20060606', '20060606 12:30:00' | 無論語言設定皆正確解析 |
| CONVERT 樣式參數 | CONVERT(datetime, '20060606', 112) | 明確指定格式,消除歧義 |
| RPC 參數傳遞 | SqlCommand.Parameters.Add(...) | 用戶端以二進位格式傳遞,本質明確 |
N'Ω' 而非 'Ω'CREATE TABLE #t1 (c1 NCHAR(1));
INSERT #t1 VALUES (N'Ω'); -- 正確儲存 Ω
INSERT #t1 VALUES ('Ω'); -- 轉換為代碼頁,若無 Ω 則存成最接近字元 (如 O)
SELECT * FROM #t1; -- 返回 Ω 和 O
字元比較 (@c < '0') 結果取決於排序規則定義的字碼順序與比較規則。預設 SQL_Latin1_General_CP1_CI_AS 下 '0'~'9'、'A'~'Z' 連續,但其他排序規則不保證。
IF @c < '0' OR @c > 'F' RETURN NULL; -- 依賴字元編碼順序,非所有排序規則安全
IF @c NOT IN ('0','1',...,'9','A','B','C','D','E','F')ISNUMERIC / PATINDEX 等不依賴排序規則的函數yyyymmdd 或 ODBC 轉義 / CONVERT 樣式DATENAMEN 前綴@c BETWEEN 'A' AND 'Z'),改用 IN 或模式比對