char,varchar,nchar,nvarchar具体含义和区别

char,varchar,nchar,nvarchar具体含义和区别

他们都是在创建数据库的时候,当你想要定义一个String

类型的数据时一般都是用上面四种类型定义。

char类型

​ 它是固定长度且非Unicode类型的字符,也就是说当你在声明的时候char(10),这时它的长度确定下来了,就算你的数据不足10字节,他也会占你10字节的空间不足的地方会用空格代替。(每个mysql版本不同,我使用的是5.5版本的char(10)这里面的10代表的是字符数,并不是字节数)

​ 这样我们用char那请不是很亏?因为事先我们不可能知道每个数据的长度,这样就比较占内存(就算数据不足长度,也会占相同的内存),但是char的效率高,因为是固定长度,方便程序的查找。所以char适合存储那些固定长度的数据:身份证号,手机号之类的。

char的取值是0~255。

mysql> create table test(
    -> id char(1));
Query OK, 0 rows affected

mysql> insert into test values('张三');
1406 - Data too long for column 'id' at row 1
mysql> alter table test modify id char(2);
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0

mysql> insert into test values('张三');
Query OK, 1 row affected

mysql> 

varchar:可变长度的且非Unicode类型的字符

​ 和char相反的是,虽然你声明的时候指定了varchar的长度,但是实际占用的内存是根据数据的长度来的,也就是说varchar(10),但是你的数据只有8字节,那么数据在实际内存中也是只占了8字节(之前的版本10代表的是字节,5.0以上代表的就是字符了)

​ 和char相比,varchar减少了内存上的开销,但是效率却不如char。

​ 由于varchar长度是不确定的,那么计算机是如何知道varchar的实际长度呢?实际上,对于varchar字段来说,需要使用一个(如果字符串长度小于255)或两个字节(长度大于255)来存储字符串的长度。varchar最大长度不能超过65535字符varchar的最大有效长度最大行大小和使用的字符集确定。整体最大长度是 65,532字节。下面说最大有效长度:

Mysql中varchar最大长度是多少?

这个并不是一个固定的值,根据不同的字符集类型,有不同的结果

gbk字符集:每个字符最多占2个字节,最大长度不能超过(65535-2)/2=32766(2代表的是存储字符串长度的字节数)

utf8字符集:一个字符(汉字)最多占3个,最大长度不能超过21844

除此之外导致实际应用中varchar长度限制的是一个行定义的长度MySQL要求一个行的定义长度不能超过65535bytes。若定义的表长度超过这个值,则提示

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。

计算举例:

举两个例说明一下实际长度的计算。

a) 若一个表只有一个varchar类型,如定义为

​ create table t4(c varchar(N)) charset=gbk;

​ 则此处N的最大值为(65535-1-2)/2= 32766 个字符。

​ 减1的原因是实际行存储从第二个字节开始’;

​ 减2的原因是varchar头部的2个字节表示长度;

​ 除2的原因是字符编码是gbk。

b) 若一个表定义为

​ create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;

​ 则此处N的最大值为 (65535-1-2-4-30*3)/3=21812

​ 减1和减2与上例相同;

​ 减4的原因是int类型的c占4个字节;

​ 减30*3的原因是char(30)占用90个字节,编码是utf8。

​ 如果被varchar超过上述的b规则,被强转成text类型,则每个字段占用定义长度为11字节,当然这已经不是“varchar”了。

则此处N的最大值为 (65535-1-2-4-30*3)/3=21812

create table t4(c int, c2 char(30), c3 varchar(21812)) ENGINE=InnoDB DEFAULT CHARSET=utf8

nchar和nvarchar:和上面不同的是他们是Unicode类型的字符

​ 也就是说无论什么字符都是使用两个字节来存储。定义的时候[n]表示的是字符的个数,n的取值范围是1到4000之间。

​ Unicode类型的字符有什么区别呢?当你的数据是多种语言组成的话,那么建议使用Unicode类型的,这样会减少出现乱码的几率,如果考虑的是兼容性的问题那么使用Unicode类型会比较好!

在效率上:varchar>nvarchar。

部分内容转载自这篇博文:https://www.cnblogs.com/webph/p/6679815.html

猜你喜欢

转载自blog.csdn.net/qq_38238296/article/details/86250831