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 affectedmysql> 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: 0mysql> insert into test values('张三');
Query OK, 1 row affectedmysql>

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

char,varchar,nchar,nvarchar具体含义和区别相关推荐

  1. 数据库中char varchar nchar nvarchar的区别

    数据库中char varchar nchar nvarchar的区别 我们在进行数据库的设计的时候,很多情况下表中的字段都是用的是字符串类型的数据,其中就有四种选择char varchar nchar ...

  2. SQL中char varchar nchar nvarchar ntext区别和使用(资料汇总)

    SQL中char varchar nchar nvarchar ntext区别和使用(资料汇总) 2008年10月14日 星期二 23:57 一.SQL中char varchar nchar nvar ...

  3. char varchar nchar nvarchar区别

    char varchar nchar nvarchar区别 char与varchar的区别 (1) char的长度是不可变的,而varchar的长度是可变的.(也就是说,定义一个char[4]和var ...

  4. SqlServer中char,varchar,nchar,nvarchar的区别

    在数据库中建表时,总是习惯的将一些字段定义为nvarchar,但关于它和nchar的区别,却没有细究过,今天上网仔细了解一下做个总结: 1.n代表的是Unicode字符,可以解决多语言字符集之间的转换 ...

  5. char varchar nchar nvarchar 四者的区别是什么(为何SQL Server自动给字符串末尾加空格)...

    本着低碳的原则将几个变量声明为nchar,结果发现尾巴上每次都多一大串空格,C#中不得不多次Trim劳心费神易出错.上网一查原来四种字符串看似相近其实讲究很多,其中以本帖最为全面,特此转发. 原帖:h ...

  6. mysql nvarchar用什么代替_mysql中char、varchar、nvarchar数据类型的用法区别

    mysql中char.varchar.nvarchar数据类型的用法区别 mysql中char.varchar.nvarchar数据类型的用法区别: 说明: 1.char: 固定长度的非 Unicod ...

  7. oracle中varchar 和 nvarchar2的区别,Oracle中char,varchar,varchar2,nvarchar,nvarchar2的区别

    一.概述 1.char char的长度是固定的,比如说,你定义了char(20),即使你你插入abc,不足二十个字节,数据库也会在abc后面自动加上17个空格,以补足二十个字节: char是区分中英文 ...

  8. Sql Server 中char、nchar、varchar、nvarchar这几种数据类型的区别

    一.从外形上看区别 char.nchar.varchar.nvarchar这四种数据类型都是用来存储字符串数据的,从外形上来看,我们能够发现他们四个之间是有所联系的. "char" ...

  9. SQL Server中的char,nchar,varchar和nvarchar有什么区别?

    nvarchar是什么意思? SQL Server中的char , nchar , varchar和nvarchar什么区别? #1楼 char :固定长度的字符数据,最大长度为8000个字符. nc ...

最新文章

  1. From 《visual C++ 6.0开发工具与调试》
  2. Google、Stanford导师带出的AI人才,是你吗?
  3. [Redux/Mobx] 说说Redux的实现流程
  4. Glide-Android下高效加载多媒体文件
  5. [转]js中escape,encodeURI,encodeURIComponent三个函数的区别
  6. python cprofile_Python Profilers 分析器
  7. 双线性对在密码学中的应用(下)
  8. 分享java50道基础面试题(有答案)
  9. python爬漫画,一人*下漫画,多线程快速的下载
  10. Zipf law 定律
  11. 华为手机便签怎样一键扫描图片转化成文字?
  12. 某剧院有33排座位java_行测备考资料:数量关系深处隐藏的整除技巧
  13. 【1945. 字符串转化后的各位数字之和】
  14. 美联航客机逃生门故障致乘客机舱过夜 承诺将赔偿
  15. 【Kali】Kali linux 2021版本GVM无法启动解决方法
  16. Ubuntu14.04下配置并使用MTK flash tool
  17. jQuery_01选择器
  18. 成绩查询系统--发布篇--centOS7 tomcat开机启动 + mysql数据库配置
  19. git 提交 全部文件
  20. 开源在线客服系统源码(PHP开发的网页在线客服聊天系统源码)

热门文章

  1. 万能角度尺做仪器校准有哪些步骤?校准机构常见流程规范
  2. 安卓屏幕朗读app_平南小学英语app安卓下载-平南小学英语2020手机版
  3. dbm数据库源代码分析(4):头文件部分(续)
  4. 开启你的UWA学堂2020年度报告
  5. 水平垂直分割详细介绍
  6. 字符串匹配------回顾大一时的一份代码
  7. python 保留浮点数为两位小数
  8. 从来只留一场梦 一场春梦成白头 上软疑似解体 忆仙剑而作
  9. win7睡眠功能无法使用(睡眠按钮变灰)
  10. CVE-2022-1388 F5 BIG-IP权限绕过命令执行漏洞复现