这是一个比较基础的问题,但是如果长时间没有去复习,很容易忘记.
今天重新温习一遍,记录如下:
在讲他们的区别之前,先值得一个基本的事情:=> 英文字符和中文字符的区别
英文字符 =》 1个英文字符只需要1个字节存储
中文字符 => 1个英文字符需要2个字节存储
这样,导致中文字符的存储和英文字符的存储不兼容,会有冲突。 为了解决这个问题,产生了一种Unicode字符集. 在Unicode字符集中,所有的字符(无论是英文字符,还是中文字符), 都统一使用2个字节存储.
这就是这里nchar,nvarchar, ntext的由来,这里的第一个字母n,就是代表unicode字符集
好了,我们一步一步来看看
char 和 varchar的区别
char => 存储的是定长数据, 比如char(8),
当你存入的字符长度小于8时,它会在后面补空值,使长度达到8
当你存入的字符长度大于8时,它会截取超出的字符,使长度只有8
用char来存储数据,存储效率,索引效率很高,但是它占用固定空间,容易造成空间浪费
varchar => 顾名思义,存储的是变长数据, 它存储的是字符的实际长度(但其实 varchar类型的实际长度是它的值的实际长度+1 => 这+1的这个字节用来保存实际占用了多少长度,也即存储字符的实际的长度值)
varchar(n) => n的范围是1-8000, 也就是说可以存储最多8000个非unicode字符(比如: 8000个英文字符), 占用8000个字节. 也可以存储4000个中文字符,占用8000个字节
显然,用varchar来存储数据,不会造成空间浪费,但是它的存储效率,索引效率都没有char高
nchar, nvarchar
就是我们上面说的,存储的是unicode字符, 也就是说如果用nchar, nvarchar类型,不管你存储的是英文还是汉字,都是1个字符(1个英文字符或者1个汉字字符)占用2个字节
所以,nvarchar(n) => n的范围是1-4000,也就是说最多存储4000个unicode字符(4000个中文字符或者4000个英文字符),占用8000个字节