zoukankan      html  css  js  c++  java
  • 关于varchar的总结

    摘自:https://www.jianshu.com/p/c3e188440c67

    大家都知道用 varchar 比用 char 类型更省空间(不过性能略有下降,char查询更快),相对于定长的 char ,varchar 存储分为两部分:

    varchar字段长度 = 字符串长度值 + 实际数据长度 N

    字符串长度值视实际数据长度,需占用 1 或 2 个字节存储。所以,我们得出:

    当实际数据长度 <= 255 时,varchar字段长度 = 1 + N;
    当实际数据长度 > 255 时,varchar字段长度 = 2 + N;

    因此,在设计数据表时,varchar(64) 和 varchar(255) 在实际应用中占用存储是一样的;varchar(256) 和 varchar(50000) 也是一样的。

    所以,varchar(n)的分水岭就是255。varchar(n),在255以下,无论设置n是多少都没区别。在varchar(255)以上,直到最大值,无论设置n是多少也没区别

    比如有些数据库里设置varchar(1023)之类的,其实这个和varchar(1024),varchar(1234)什么的都没有任何区别!1023并不会比1024少用一个字节,1023并不是一个特殊值,只有255才是。

    所以设计数据库字段的时候,只需要考虑字符串是否会超过255就可以了,其他不用考虑。需要注意的是,这里varchar(n)的n是字符长度,不是字节长度,实际占用空间跟字符编码有关。


    那么问题来了,为什么不在设计时就尽可能把最大长度设置大一些,免得未来长度不够惹麻烦呢?比如,用户名能用 varchar(200) 就不必用 varchar(20),存储稍大一些字符串的字段,能用 varchar(2000) 就不必斤斤计较用 varchar(256)。

    这么长的空间,能存储多少汉字呢?如果采用 UTF-8 编码存储,每个汉字占用 3 个字节;如果采用可以放表情的 utf8mb4,每个汉字占用 4字节。

    当然,长度也不是可以无限长,varchar 字段长度在设计表时需要考虑下面因素:

    • UTF-8 状态下,单个 varchar 长度不能超过 (65535 - 2) / 3 = 21844;
    • 一行数据所有字段长度加起来不能超过 65535;
    • 如果需要存储超长文本,考虑使用 text 类型,只存储指针长度
      所以,知道了上面的知识点后,下次在设计数据库的时候,就不必太纠结 varchar(N) 中的 N 值了,条件允许的前提下,尽可能设大一些吧。

    所以不要再吝啬 varchar 的长度了。




  • 相关阅读:
    解决远程桌面复制文件大于3G出错问题
    c++builder Form重载WindowProc、WndProc 截获消息
    FireDAC指定mssql驱动
    C++Builder 增加IPEdit控件
    MySQL 字符串按数值进行排序
    Java POI导出Word表格并使用输出流下载文件弹出打开保存框
    Java POI导出Excel并使用输出流下载文件弹出打开保存框
    MySQL 查询除某些字段以外的值
    MySQL 一个字段多个值查询
    Java Calendar 计算两个时间相隔天数
  • 原文地址:https://www.cnblogs.com/xinruyi/p/11403151.html
Copyright © 2011-2022 走看看