CHAR
CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间。
- 定长
- 索引效率极高
- 可以保存8000字节
- 一般存英文(也可以保存Unicode编码中文)
- 在C语言中,char类型占1一个字节,而汉子占2个字节,所以不能存储。
- 在Java中,char类型占2个字节,而且Java默认采用Unicode编码,以个Unicode码是16位,所以一个Unicode码占两个字节,Java中无论汉子还是英文字母都是用Unicode编码来表示的。所以,在Java中,char类型变量可以存储一个中文汉字。
- 在C#中,char也为两个字节;
VARCHAR
存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。
- 变长
- 索引效率高
- 可以保存8000字节
NCHAR、NVARCHAR从名字上看比前面三种多了个“N”。它表示存储的是Unicode数据类型的字符。我们知道字符 中、英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这 种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。
NCHAR
- 定长
- 可以保存4000个字符(8000字节)
- 可以保存中、英文,每个字符都占两个字节
NVARCHAR
- 变长
- 可以保存4000个字符(8000字节)
- 可以保存中、英文,每个字符都占两个字节
- n表示Unicode字符,即所有字符都占两个字节
- 带n 的可以存储 4000个字符,英文字母存在n 类型上也是按两个字节计算。
- 不带n的可以存储8000个字符,英文字符按一个字节,中文字按两个字节。
- 一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar
- 列中的数据值大小接近一致,请使用 char。
- 列中的数据值大小显著不同,请使用 varchar。
- 列中所有数据项的大小接近一致,则使用 nchar。
- 列中数据项的大小差异很大,则使用 nvarchar。
总结
char(n) | varchr(n) | nvarchar(n) | |
---|---|---|---|
n最大值 | 8000 | 8000 | 4000 |
数据长度 | 固定(不足用空格补) | 可变 | 可变 |
编码 | ANSI字符 | ANSI字符 | Unicode字符 |
存储方式 | 按字节 | 按字节 | 按字符 |
可存最多英文(数字) | 8000 | 8000 | 4000 |
英文(数字)所占字节 | 1 | 1 | 2 |
可存最多中文 | 4000 | 4000 | 4000 |
中文所占字节 | 2 | 2 | 2 |
检索速度 | 快 | 慢 | 慢 |
建议使用场景1 | 英文(数字) | 英文(数字) | 中、英、数字 |
建议使用场景2 | 数据值大小接近 | 数据值大小不同 | 数据项的大小差异很大 |
建议使用场景2 | 数据长度确定 | 数据长度可变 | 数据长度可变 |
特点 | 读取时最好trim |
- text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。