2017年7月13日 星期四

[研究] SQL Server Data Types 研究

[研究] SQL Server Data Types 研究

2017-06-22

新版本的 SQL Server,支援的種類和長度定義可以有改變,一切以官方最新公告為準。

********************************************************************************

Data Types (Transact-SQL) (SQL Server 2008)
2017-3-30
https://msdn.microsoft.com/zh-tw/library/ms187752(v=sql.110).aspx
https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-types-transact-sql

bigint    -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807)  8 位元組

int    -2^31 (-2,147,483,648) 到 2^31-1 (2,147,483,647)  4 個位元組

nchar [ ( n ) ]
固定長度的 Unicode 字串資料。 n 會定義字串長度,而且必須是 1 到 4,000 之間的值。 儲存體大小是 n 個位元組的兩倍。 當定序字碼頁使用雙位元組字元時,儲存體大小仍是 n 位元組。 根據字串,n 位元組的儲存體大小可能小於針對 n 所指定的值。 nchar 的 ISO 同義字是 national char 和 national character。

nvarchar [ ( n | max ) ]
長度可變的 Unicode 字串資料。 n 會定義字串長度,而且可以是 1 到 4,000 之間的值。 max 表示儲存體大小上限是 2^31-1 個位元組 (2 GB)。 儲存體大小 (以位元組為單位) 是輸入資料之實際長度的兩倍 + 2 位元組。 nvarchar 的 ISO 同義字是 national char varying 和 national character varying。

********************************************************************************

text, text, and image (Transact-SQL) (SQL Server 2008)
2016-7-30
https://msdn.microsoft.com/zh-tw/library/ms187993(v=sql.110).aspx
https://docs.microsoft.com/zh-tw/sql/t-sql/data-types/ntext-text-and-image-transact-sql
在未來的 Microsoft SQL Server 版本中,將移除 ntext、text 和 image 等資料類型。

********************************************************************************

全文檢索搜尋
2016-7-29
https://docs.microsoft.com/zh-tw/sql/relational-databases/search/full-text-search
只支援 char、varchar、nchar、nvarchar、text、ntext、image、xml 或 varbinary(max) 和 FILESTREAM

********************************************************************************

請問字串資料行可以都偷懶開nvarchar(max)嗎?
https://social.msdn.microsoft.com/Forums/zh-TW/68a0ccb6-a3df-4396-89cb-3e2534c2b0c8/nvarcharmax?forum=240
  • nvarchar(max)會造成查詢效能低落,不能建立索引的索引鍵資料行
  • 資料庫儲存引擎對不同的資料型態有不同的對待方式,固定長度欄位直接搜尋分頁指標位置取出資料,可變長度欄位會先算資料實際長度再進入分頁取資料,速度本來就會比固定長度慢一些,用 max 方式宣告的話,儲存引擎會將它視為 LOB 資料型態,會將它儲存到額外的分頁內,光是在磁碟中搜尋這些分頁的成本會比計算長度更高 (別忘了這是 I/O 動作),會使得查詢和寫入速度都變慢。資料少量時看不出來,等量很大時就準備哭哭吧。
  • max的話,是沒辦法針對它去建立index的,只能用included去包含它!
  • 整數型別 int/bigint 的儲存方式是相同的,它不會被當做 LOB 而有不同的處理方式。

(待續)

相關

SQL Data Types for Various DBs
https://www.w3schools.com/sql/sql_datatypes.asp

沒有留言:

張貼留言