原文地址:MySQL 中 char 与 varchar 能存多少汉字问题作者:下一步

char是一种固定长度的类型,varchar则是一种可变长度的类型。
 其区别在于:
 chchar(M)类型的数据列里,每个值都占用M个字节,如果长度小于M,MySQL就会在它的右边用空格字符来填补空缺.
 而vvarchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上1个或者2个用来记录其长度的字节
(即总长度为L+1字节或者是 L+2字节,长度超过255时需要2个字节),因此最大长度不能超过65535。

请注意: 在mysql里

4.0版本以下varchar(5),指的是5字节,如果存放UTF8汉字时,只能存1个(每个汉字3字节)
5.0版本以上varchar(5),指的是5字符,无论存放的是数字 ,字母还是UTF8汉字(每个汉字3字节)都可以存放5个,最大大小是65532字节

在MySQL中用来判断是否需要进行对据列类型转换的规则
 
1、在一张数据表里,如果每一个数据列的长度都是固定的,那么每一个数据行的长度也将是固定的.
 
2、只要数据表里有一个数据列的长度是可变的,那么所有数据行的长度都是可变的.
 
3、如果某个数据表里的数据行的长度是可变的,那么,为了节约存储空间,MySQL会把这个数据表里的固定长度类型的数据列转换为相应的可变长度类型

1. 不同编码,能存储的字符数
 
 a.字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;
 b.字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。
 
  ps: 若定义的时候超过上述限制,则varchar字段会被强行转为 mediumtext类型 (mysql5.1.56),如下

<<A href="mailto:root@localhost">root@localhost nigel 17:10:05>alter table t1 modify id varchar(32766);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

<<A href="mailto:root@localhost">root@localhost nigel 17:10:30>show  create table t1;
+-------+--------------------------------------------------------------------------------------------+
| Table | Create Table                                                                               |
+-------+--------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `id` varchar(32766) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+-------+--------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

<<A href="mailto:root@localhost">root@localhost nigel 17:10:31>alter table t1 modify id varchar(32767);
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 href="mailto:root@localhost">root@localhost nigel 17:10:36>alter table t1 modify id varchar(32768);
Query OK, 0 rows affected, 2 warnings (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

<<A href="mailto:root@localhost">root@localhost nigel 17:10:40>show  create table t1;
+-------+---------------------------------------------------------------------------+
| Table | Create Table                                                              |
+-------+---------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `id` mediumtext
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+-------+---------------------------------------------------------------------------+
1 row in set (0.00 sec)

2,计算方法
 1.   若一个表只有一个varchar类型,如定义为
 
   create table t1(id varchar(M)) charset=gbk;
 
   则此处M的最大值为(65535-1-2)/2= 32766
   * -1的原因是实际行存储从第二个字节开始
   * -2的是因varchar头部的2个字节表示长度
   * 除2的是因为字符编码是gbk
2, 若一个表定义为
 
create table t1(id int,grade char(30), text varchar(N)) charset=utf8;
 
 则此处M的最大值为 (65535-1-2-4-30*3)/3=21812
 
  -1和-2和上实例相同
 
 -4是因为int类型的id占4个字节;
 
 -30*3的原因是char(30)占用90个字节,编码是utf8
ps: 由上可见,在一张表里的char varchar 的类型字段的总长度是所有字段加和的

qq: 45899077

讨论群: 65576300

[转载]MySQL 中 char 与 varchar 能存多少汉字问题_-Chaz-_新浪博客相关推荐

  1. [转载]Qt之中文显示(QMessageBox、QLineEdit右键菜单等)_vortex_新浪博客

    原文地址:Qt之中文显示(QMessageBox.QLineEdit右键菜单等)作者:一去丶二三里 在编写Qt程序的时候,总会碰到中文问题,一直都很困惑,原本在使用QLineEdit的时候总会出现右键 ...

  2. 模电学习心得(转载)_史蒂文森sun_新浪博客

    个人建议:认真分析几个典型电路,主要掌握晶体管的等效模型,以及在电路中怎么等效.其他的都很容易解决了.只要会等效了,模电就是完全是电路的内容.其实一点都不可怕,开始不要太关注乱七八糟的内容,抓住主要的 ...

  3. [转载]R软件包vegan教程 5.1 函数adonis的使用_圈圈Bio_新浪博客

    原文地址:R软件包vegan教程 5.1 函数adonis的使用作者:mateco 5 差异和环境(Dissimilarities and environment) 已经讨论了排序的环境因子解释,和环 ...

  4. MapGis中如何输入分数、带有上下标格式的注释_map2shp_新浪博客

    1.MAPGIS中输入上下标格式字符串. 输入立方米: M# 3 //上标 输入二氧化碳: CO#-2 //下标 输入上下标混合: CO#-2# 3#=SO#-4 //上下标混合使用 2.MAPGIS ...

  5. 当前电气自动化专业就业形势调查报告 (转载)_史蒂文森sun_新浪博客

    当前电气自动化专业就业形势调查报告  尽早了解本专业的设置及就业情况有助于我们确定自己的发展方向,当竞争工作时,能有更多的优势.为此,本人于2012年2月18日至3月10日进行了调查,通过文献查阅.实 ...

  6. [转载]FAE及其发展前景_史蒂文森sun_新浪博客

    原文地址:FAE及其发展前景作者:Robby FAE Field Application Engineer(现场应用工程师) ,其他的说法就叫技术支持   主要工作内容: 1.提供产品技术支持,包括咨 ...

  7. mysql中char与varchar的区别分析

    原文网址:http://www.jb51.net/article/23575.htm mysql中char与varchar的区别分析 作者: 字体:[增加 减小] 类型:转载 在mysql教程中cha ...

  8. mysql中nchar_浅谈SQL Server、MySQL中char,varchar,nchar,nvarchar区别

    1,定义: char:    固定长度,存储ANSI字符,不足的补英文半角空格. nchar:   固定长度,存储Unicode字符,不足的补英文半角空格 varchar:  可变长度,存储ANSI字 ...

  9. MySQL中char,varchar和text的区别

    MySQL中char,varchar和text的区别 java程序中的string类型,在mysql数据表中可以有三种对应的类型:char,varchar和text. char,varchar和tex ...

  10. [转载]如何让上传到新浪博客和相册中的照片更大更清晰_我是亲民_新浪博客

    原文地址:如何让上传到新浪博客和相册中的照片更大更清晰作者:李永宏 如何让上传到新浪博客和相册中的照片更大更清晰 图.文 李永宏 以前有朋友问我,怎么你上传到博客里的照片看起来不是很清晰,你用什么相机 ...

最新文章

  1. 前端开发学习常用网站网址及介绍(都是免费的)
  2. jakarta_迁移到Jakarta EE 9
  3. Android短信拦截2019,关于征集2019年度信息科学领域重大项目立项建议的通告
  4. linux vnc用户,给CentOS服务器添加用户并开启vncserver的方法
  5. 《Head First Python》第六章--定制数据对象
  6. md5和password_hash孰好孰坏
  7. 使用volatile关键字的场景
  8. JavaScript中数组去重的几种方法整理
  9. 如何在三层交换机上实现跨VLAN 的DHCP配置
  10. nvidia控制面板只有3d设置?
  11. VSCode使用Windows用户名而不是config中设置的User
  12. 360一直把oracle当成病毒,为什么360一直把软件程序当做木马?
  13. 从技术角度谈如何开发一款微信联网小游戏
  14. 有免费而且好用的视频会议吗
  15. 完美兼容MIC5203-3.3BM5的高压LDO-CSM5133SE/CSM5130SE
  16. 重邮计算机专业毕业月薪多少,高校就业质量报告⑥ | 重庆邮电大学2020届毕业生月均收入6800元...
  17. python希腊字母字符串_#10 Python字符串
  18. Spark支持三种分布式部署方式
  19. ArchiCAD与Revit深度对比
  20. 我的专业计算机作文700字,我的专业作文700字

热门文章

  1. 横图图片广告代码html,jQuery网页底部固定横幅图片广告代码
  2. 无线局域网和蜂窝移动网络_手机连上WiFi之后,你会关闭移动网络吗?这其中大有讲究...
  3. Android: Fragment (Trying to instantiate a class that is not a Fragment)
  4. 数理统计实(试)验—双因素方差分析(有交互作用)excel操作分析方差分析表怎么看?
  5. C# 合并Excel工作表
  6. c# 操作ppt 设置背景色、字体颜色、PPT转图片
  7. python字符串赋值列表_Python 第二篇:python字符串、列表和字典的基本操作方法...
  8. 模拟退火算法应用(Java)
  9. 关于E-R(实体-联系)图
  10. 自学PS-持续更新 共勉