博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL中需要注意的字段长度问题
阅读量:2446 次
发布时间:2019-05-10

本文共 2630 字,大约阅读时间需要 8 分钟。

在MySQL的表结构设计中,突然想起来几个地方碰到的问题比较多,大体来说一个就是字符集,一个就是数据类型。

而字符集和数据类型结合起来,就有一个蛮有意思的细节,那就是行长度的问题。

比如我们创建一个表使用了varchar的类型,如果指定为gbk,表里含有一个字段,可以指定为32766字节,如果再长一些就不行了。

其中的计算方式就需要理解了,因为varhcar类型长度大于255,所以需要2个字节存储值的长度,而MySQL里面的页的单位是16k,使用了IOT的方式来存储。所以如果超过了这个长度,那就会有溢出的情况,和Oracle的overflow很类似。

所以对于gbk类型,行长度最大为65535,则varchar列的最大长度算法就是 (65535-2)/2 =32766.5,所以此处就是32766了。

> create table test_char(v varchar(32766)) charset=gbk;

Query OK, 0 rows affected (0.00 sec)
> create table test_char1(v varchar(32767)) charset=gbk;
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而另外一种字符集,也是默认的字符集latin1,有些系统支持火星文的还是会喜欢用这种字符集。

它的长度就不一样了,对应是1字节,所以varchar(32767)是没有任何问题的,而最大长度就是65532了。

> create table test_char1(v varchar(32767)) charset=latin1;
Query OK, 0 rows affected (0.01 sec)
> create table test_char2(v varchar(65535)) charset=latin1;
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而对于utf8还是有很大的差别,对应的是3个字节,所以需要除以3,按照(65535-2)/3,最大值就是21844了。
> create table test_char2(v varchar(21844)) charset=utf8;    
Query OK, 0 rows affected (0.00 sec)
> create table test_char3(v varchar(21845)) charset=utf8;
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上面的场景相对来说会有一些局限性,那么我们引入表结构的设计。

如果是gbk字符集,含有下面的几个字段,则memo字段的varchar类型最大长度是多少?

> create table test_char3(id int,name varchar(20),memo varchar(32766)) charset=gbk;

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

这个问题还是如法炮制,应用之前的计算方式,数值型是4个字节,字符型乘以2,含有字符型的长度小于255,所以减去1即可,这样下来就是(65535-1-4-20*2-2)约等于32743

> create table test_char3(id int,name varchar(20),memo varchar(32744)) charset=gbk;

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 BLOB两种测试结果可以简单对比一下。
> create table test_char3(id int,name varchar(20),memo varchar(32743)) charset=gbk;
Query OK, 0 rows affected (0.01 sec)
select (65535-1-4-20*2-2)/2;
+----------------------+
| (65535-1-4-20*2-2)/2 |
+----------------------+
|           32744.0000 |
+----------------------+
1 row in set (0.00 sec)

整个过程还是需要考虑到这些点的,否则前期不够重视,在后面去做扩展的时候就会有很大的限制。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23718752/viewspace-2141361/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23718752/viewspace-2141361/

你可能感兴趣的文章
使用批处理脚本上传ftp_通过批处理脚本将文件上传到FTP站点
查看>>
linux下如何更改主机名_如何在不重新启动的情况下更改Linux主机名
查看>>
pxe网络启动引导程序_如何使用PXE设置网络可引导实用程序光盘
查看>>
凌乱的yyy_如何清理凌乱的Internet Explorer上下文菜单
查看>>
Laravel Eloquent:API资源
查看>>
在React中使用Font Awesome 5
查看>>
React Hooks入门
查看>>
盖茨比乔布斯_用盖茨比快速浏览WordPress站点
查看>>
vue.js表单验证_Vue.js中的模板驱动表单验证
查看>>
软件测试结束标志_使用功能标志进行生产中的测试
查看>>
css网格_在CSS网格中放置,跨度和密度
查看>>
火狐动态调试css_使用Firefox开发工具调试CSS网格
查看>>
服务周期性工作内容_使服务工作者生命周期神秘化
查看>>
nuxt.js 全局 js_在Nuxt.js应用中实现身份验证
查看>>
具有NgClass和NgStyle的Angular 2+类
查看>>
网络抓取_使用ScrapeStack轻松进行网络抓取
查看>>
koa express_Koa简介-Express的未来
查看>>
github请求超时_在GitHub中创建第一个请求请求
查看>>
JavaScript函数式编程介绍:使用map(),filter()和reduce()进行列表处理
查看>>
构建自定义JavaScript Scrollspy导航
查看>>