背景 最近我們遷移了一批伺服器,因我們在azure portal 上新開的VM暫時預設只有英文系統,所以我們在開設好的資料庫伺服器的時候,都會重置資料庫字元排序成中文,避免出現中文亂碼問題,重置參考路徑。但最近有個項目反饋,遷移後出現轉換datatime類型時報錯。 系統環境 Microsoft S ...
背景
最近我們遷移了一批伺服器,因我們在azure portal 上新開的VM暫時預設只有英文系統,所以我們在開設好的資料庫伺服器的時候,都會重置資料庫字元排序成中文,避免出現中文亂碼問題,重置參考路徑。但最近有個項目反饋,遷移後出現轉換datatime類型時報錯。系統環境
Microsoft SQL Server 2012 (SP3-CU2) (KB3137746) - 11.0.6523.0 (X64) Mar 2 2016 21:29:16 Copyright (c) Microsoft Corporation Web Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)分析過程
通過比較分析遷移前和遷移後的日期格式,發生類型轉換報錯的場景是,遷移前的日期存入字元類型後,再從字元類型轉回datetime 就報錯,報錯內容如下:消息 241,級別 16,狀態 1,第 4 行 Conversion failed when converting date and/or time from character string.
通過進一步的分析驗證,準確的說原來在中文環境的日期存入字元類型(即遷移前的日期存成字元類型之後),再從字元類型轉回datetime類型就會報錯,最新存入的日期轉換是沒有問題。我們先不討論為什麼要如此折騰的轉換類型。通過簡化代碼對比如下:
如上圖,同一天,如是中文環境日期存在字元中就是06 而英文環境就Jun ,其他都一樣,上述SELECT CAST('06 28 2017 10:19PM' AS DATETIME)
在英文環境下就是會報錯,原因是遷移後的資料庫預設語言還是English與遷移前的簡體中文不一致,調整就比較簡單了。
1 exec sp_configure 'show advanced options',1 2 RECONFIGURE; 3 4 exec sp_configure 'default language',30; 5 RECONFIGURE 6 7 exec sp_configure 'show advanced options',0 8 RECONFIGURE; 9 10 ALTER LOGIN sa --以SA為例 11 WITH DEFAULT_LANGUAGE = [簡體中文];
把當前英文環境下已存入的幾條記錄JUN修改成06之後,就沒有類型轉換報錯了,暫時沒有找到上述兩種日期字元類型轉換datetime共存的方案,如有麻煩分享學習一下。