天天看點

一句話證明你懂那些char

“請說明char、varchar、nchar、nvarchar的差別是什麼?”——這是一個在國際化測試人員面試過程中時常被提起的問題。不過可惜的是,能準确回答這個問題,同時又言簡意赅的面試者卻遠比想象中的少。本文站在面試者角度,探索是否能找出一句話就能證明你懂那些char的所謂标準答案。

首先,需要引入兩個次元來考量。 

1. 定長和變長

定長即長度固定,當輸入的資料長度沒有達到指定的長度時将自動以英文半角空格填充,以達到相應的長度。變長即長度不固定,以實際存儲空間為準,不會以空格填充。

2. Unicode和非Unicode

資料庫中,英文字元隻需要一個位元組存儲,但中文和其他非英文字元,則需要兩個位元組存儲。如果中英文同時存在,由于占用空間數不同,容易造成混亂,進而導緻亂碼的出現。Unicode字元集就是為了解決這種不相容問題而産生的,它所有的字元都用兩個位元組表示,即便是英文字元,也占用兩個位元組。

這裡以SQL Server為技術背景,将string字段可分為以下四種類型(暫不考慮text和ntext):

  • char
存儲定長ANSI字元,字段上索引效率高。一旦定義了char(10),就意味着無論存儲的資料是否真的達到了10位元組,都要占10位元組的空間,不足部分用英文半角空格補全。
  • varchar
存儲變長ANSI字元,但效率沒有char高。假設某個字段的值是變長的,但我們知道其最大不能超過10個字元,那麼定義該字段為 varchar(10)是最合适的。另外需要注意的是varchar類型的資料長度是其值的實際長度+1。多出來的這一個位元組用于儲存實際使用了多大的長度。
  • nchar
存儲定長Unicode字元資料,不足的部分用英文半角空格補全。
  • nvarchar
存儲變長Unicode字元,包含 n個字元的可變長度 Unicode資料。n 的值須介于 1到 4000。位元組的存儲大小是所輸入字元個數的兩倍。

和char、varchar相比,nchar、nvarchar最多存儲4000個字元,無論英文還是非英文。而char、varchar最多能存儲8000個英文字元。但使用nchar、nvarchar資料類型時不用擔心輸入的字元是否為英文,更适應國際化開發,隻是在存儲數量上有些損失。

說了這麼多,用一句話總結就是——如果沒有國際化需求,定長用char,變長用varchar;需要考慮國際化,定長用nchar,變長用nvarchar。

相信隻要這句話一出,面試官不讓你pass也不行喽!