Mysql 里CHAR和VARCHAR的最大长度及一些注意事项
先写出结论:
Mysql 5中
非空CHAR的最大总长度是255【字节】;非空VARCHAR的最大总长度是65533【字节】。
可空CHAR的最大总长度是254【字节】;可空VARCHAR的最大总长度是65532【字节】。
原因:非空标记需要占据一个字节,VARCHAR超过255需要用2个字节标记字段长度,不超过255用1个字节标记字段长度.
注意上边是 【字节】,不是【字符】。但mysql5字段定义时,是定义的【字符】数。比如varchar(10),你仅能存入10个英文字母或者汉字,尽管一个字符可能占多个字节。
一个字符可能占用多个字节,这由编码和存放的字符决定。比如UTF8(一种变长的unicode编码)中,一般一个汉字占据3个字节,一个英文字母占据一个字节。
所以,在UTF8的环境下,不允许定义 VARCHAR(65535),因为这远远超出了65535个字节的限制。
以下是MYSQL 官网上的说明:
CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
CHAR和VARCHAR类型声明的长度表示你想要保存的最大字符数。例如,CHAR(30)可以占用30个字符。
CHAR列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。
VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值。(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。
同CHAR对比,VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。
VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。
如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。参见5.3.2节,“SQL服务器模式”。
下面的表显示了将各种字符串值保存到CHAR(4)和VARCHAR(4)列后的结果,说明了CHAR和VARCHAR之间的差别:
值
CHAR(4)
存储需求
VARCHAR(4)
存储需求
''
<span ' '
4个字节
''
1个字节
'ab'
<span 'ab '
4个字节
'ab '
3个字节
'abcd'
'abcd'
4个字节
'abcd'
5个字节
'abcdefgh'
'abcd'
4个字节
'abcd'
5个字节
请注意上表中最后一行的值只适用不使用严格模式时;如果MySQL运行在严格模式,超过列长度不的值不保存,并且会出现错误。
从CHAR(4)和VARCHAR(4)列检索的值并不总是相同,因为检索时从CHAR列删除了尾部的空格。通过下面的例子说明该差别:
mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO vc VALUES ('ab ', 'ab ');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM vc;
+----------------+----------------+
| CONCAT(v, '+') | CONCAT(c, '+') |
+----------------+----------------+
| ab + | ab+ |
+----------------+----------------+
1 row in set (0.00 sec)
根据分配给列的字符集校对规则对CHAR和VARCHAR列中的值进行排序和比较。
请注意所有MySQL校对规则属于PADSPACE类。这说明在MySQL中的所有CHAR和VARCHAR值比较时不需要考虑任何尾部空格。
参考:
http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#char
Mysql 里CHAR和VARCHAR的最大长度及一些注意事项的更多相关文章
- MySQL中char与varchar区别,varchar最大长度是多少?
一.首先来说下字符与字节的区别: 字符与字节它们完全不是一个位面的概念,所以两者之间没有"区别"这一说法.在不同编码里,字符和字节的对应关系是不同的.一般来说,半角英文状态下一个字 ...
- MySql之char与varchar
MySql之char与varchar的差别 char是一种固定长度的类型,varchar则是一种可变长度的类型.它们的差别是: 1. char(M)类型的数据列里.每一个值都占用M个字节.假设某个长 ...
- 浅谈SQL Server、MySQL中char,varchar,nchar,nvarchar区别
最近一次的面试中,被面试官问到varchar和nvarchar的区别,脑海里记得是定长和可变长度的区别,但却没能说出来.后来,在网上找了下网友总结的区别.在这里做个备忘录: 一,SQL Server中 ...
- MySQL中char、varchar和text的区别
三者空间占用方面: char:存储定长数据很方便,CHAR字段上的索引效率极高,可以有默认值,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间(自动用空格填 ...
- Mysql学习总结(29)——MySQL中CHAR和VARCHAR
MySQL数据库的字符(串)类不要以为字符类型就是CHAR,CHAR和VARCHAR的区别在于CHAR是固定长度,只要你定义一个字段是CHAR(10),那么不论你存储的数据是否达到了10个字节,它都要 ...
- [转载]MySQL之char、varchar和text的设计
[转载]MySQL之char.varchar和text的设计 来源:https://www.cnblogs.com/billyxp/p/3548540.html 首先我们先普及一下常识: 1.char ...
- 万答#11,MySQL中char与varchar有什么区别
万答#11,MySQL中char与varchar有什么区别 1.实验场景 GreatSQL 8.0.25 InnoDB 2.实验测试 2.1 区别 参数 char varchar 长度是否可变 定长 ...
- MySQL的char和varchar针对空格的处理
MySQL的char和varchar存储和查询中包含空格的实验 MySQL版本 一.测试char包含空格的存储和查询 测试发现,存储的数据,char数据类型的右侧空格存储的时候被删除了,但是左侧空格还 ...
- mysql中char与varchar的区别分析(补充一句,int和integer没区别)
转自:http://www.jb51.net/article/23575.htm 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定 ...
随机推荐
- python-day10(正式学习)
目录 字符编码 计算机基础 文本编辑器存取文件的原理 python解释器执行py文件的原理 python解释器与文本编辑的异同 字符编码介绍 字符编码的分类 乱码分析 总结 文件操作 三种基本操作 文 ...
- 设置队列中文件上的“X”号的点击事件+uploadLimit动态加1
目的:1.设置文件队列中“x”号的点击事件 2.每次删除服务器文件后,把uploadLimit + 1: 'onUploadSuccess': function (file, data, respon ...
- sql server 函数详解(5)系统函数
返回表中指定字段的长度 返回表中指定字段的名称 返回数据表达式的数据的实际长度函数 返回数据库的编号 返回数据库的名称 返回数据库当前默认的null值 返回服务器端计算机的标识号 返回服务 ...
- 线程的函数中调用MFC对话框类的变量
线程的函数中调用MFC对话框类的变量多线程传输文件的对话框 现在想要在对话框上添加一个进度条 为进度条映射变量m_progress这就需要在传输一段文件后就更新m_progress的值使进度条前进 也 ...
- ffmpeg3.3.2命令行参数笔记
组成: 1.libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,包含demuxers和muxer库: 2.libavcodec:用 ...
- python、第二篇:库相关操作
一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MyS ...
- 服务器挂载 ntfs32 硬盘
1,fdisk -l 查看硬盘名称 2,mount -t ntfs-3g /硬盘名/ /目标目录/ 3,umount /硬盘名/ 4,如果卸载不了 就fuser -km /目标目录/
- C++ GB2312 和 utf8 在win32下 互转
string ANSItoUTF8(const char* strAnsi) { //获取转换为宽字节后需要的缓冲区大小,创建宽字节缓冲区,936为简体中文GB2312代码页 , NULL, NULL ...
- linux 静态路由
用ip route删除默认路由 ip route del default via 192.168.18.1 用route删除默认路由route del default gw 192.168.18.1 ...
- 002-loganalyzer装完报错no syslog records found
1.登录mysql查看库Syslog中的表SystemEvents;是否有返回数据 # select * from Syslog.SystemEvents; #又返回数据说明rsyslog配置正确, ...