選擇資料型態原則就是:長度夠用就好
若有欄位是儲存國家地區代碼,就應該使用 CHAR(2)
TW,EN,GB ... etc
參考 ISO 標準
https://en.wikipedia.org/wiki/ISO_3166-1_alpha-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 服務無法切換預設時區
若要調整 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