將編輯好的 SQL 查詢複製到 SSMS 會出現無法執行錯誤

資料型態的選擇 | 2019 鐵人賽

選擇資料型態原則就是:長度夠用就好

欄位長度選擇案例

若有欄位是儲存國家地區代碼,就應該使用 CHAR(2)

TW,EN,GB ... etc

參考 ISO 標準 https://en.wikipedia.org/wiki/ISO3166-1alpha-2

字串欄位

若今天僅儲存英數字資料型態就可以使用 VARCHAR(N)

員工資料的英文姓名、商品英文名稱

長度固定的字串欄位就可以使用 CHAR(N)

訂單編號

當欄位儲存非英文字的名稱,就應使用 NVARCHAR(N) 欄位

員工資料的中文名稱

有人會問說「可是我的 VARCHAR 資料型態還是可以儲存中文」

VARCHAR 能夠儲存中文是根據資料庫「定序」而定

當今天資料庫定序是非中文設定時

VARCHAR 儲存的中文內容就會變成亂碼

此問題會經常發生在資料從不同資料庫轉移的過程

請注意在 SQL Server 資料庫中

VARCHAR(1) 相較之下是浪費空間的欄位型態:使用 (1+2 bytes)
應使用 CHAR(1):使用 (1 bytes)

電子商務網站的訂單狀態適合使用 TINYINT (只需要一個 Byte)

時間欄位

若使用 Azure SQL Database
要注意預設情況下 GETDATE() 取得的時間為 UTC 時間

應用程式有跨時區問題的話
欄位就應考慮使用 DATETIMEOFFSET 型態來儲存時區位移

台北時間為 +08:00

截至目前:Azure Database 服務無法切換預設時區

在查詢中搭配 AT TIME ZONE 切換時區

若要調整 DATATIMEOFFSET 資料型態顯示日期時間的話 可使用 AT TIME ZONE 搭配該時區文字進行切換

TPE 時間名稱為「Taipei Standard Time」

範例 Transact-SQL 指令碼如下

DECLARE @TimeZone NVARCHAR(100)

SET @TimeZone = 'Taipei Standard Time'

SELECT SYSDATETIMEOFFSET() [DateTime(UTC)]
    ,SYSDATETIMEOFFSET() AT TIME ZONE @TimeZone [DateTime(TPE)]

/*
output
--------------------------------------------------------------------------
DateTime(UTC)                            DateTime(TPE)
2019-09-02 09:43:01.5612886 +00:00        2019-09-02 17:43:01.5612886 +08:00
--------------------------------------------------------------------------
*/

時區轉換參考資料

https://docs.microsoft.com/en-us/sql/t-sql/queries/at-time-zone-transact-sql?view=sql-server-2017

https://techcommunity.microsoft.com/t5/Azure-Database-Support-Blog/Lesson-Learned-4-Modifying-the-default-time-zone-for-your-local/ba-p/368798

留言