zoukankan      html  css  js  c++  java
  • MySQL之varchar

    MySQL之varchar

    0.前言


     探究关于MySQL中varchar长度的定义

    1.研究MySQL的varchar列类型的背景


    1.MySQL5.x

    2.InnoDB

     2.varchar


    对于varchar的争论,目前总结来看,主要有三种看法:(注:以下讨论仅仅在非严格模式下的MySQL)

    第一种:(错误)

    varchar(3)表示varchar能存储3个字节,存储如下表:

    要插入的字符实际存入的字符占用长度
    ab ab 2字节
    abc abc 3字节
    abcd abc 3字节

     

     第二种:(4.x版本)

    varchar(3)不能表示varchar能存储3个字节,因为按照MySQL官方文档的定义,会有一个字节用来存储长度,所以3个字节只能存两个字母字符。

    要插入的字符实际存入的字符占用长度
    ab ab 3字节
    abc ab 3字节
    abcd ab 3字节 

     这种说法很有道理,因为官方文档都说了,会有一个字节用来存储长度。这里把文档的原话翻译一下引入进来:

    VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。

    第三种:(5.x版本)

    varchar(3)表示varchar能够存储3个字符,注意这里是字符,不是字节。也就是说无论汉字,还是字母等,都是一个字符。

    要插入的字符实际存入的字符占用长度
    ab ab 3字节
    abc abc 4字节
    abcd abc 4字节
    中国人 中国人 10字节

    这里有个前提,即编码格式是UTF8。这是需要注意的点是中间的连字符:数据库中为UTF8 ,在程序中是UTF-8.

    MySQL字符集

    MySQL字符集的解释,http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/charset.html

    MySQL支持的字符集有Unicode字符集,西欧字符集,中欧字符集,南欧与中东字符集,波罗的海字符集,西里尔字符集和亚洲字符集。

    这么多我也是看醉了。最常用的是Unicode字符集,而这种字符集里又分两种,一种ucs2,另一种为utf8

    UTF8字符集的思想,是不同Unicode字符采用变长字节序列编码:

    • 基本拉丁字母,数字和标点使用一个字节
    • 大多数的欧洲和中东手写字母适合两个字节序列
    • 韩语,中文和日本象形文字使用三个字节序列

    3.MySQL存储

    上一章讨论的结果,从官方文档中证实5.x下第三种说法是正确的。如果要存50个字符,就定义成varchar(50)。

    以前老代码中,很多都都定义成varchar(63),varchar(127),varchar(255)这样。这是MySQL4.x的影响。

    MySQL的InnoDB存储结构

    MySQL中InnoDB的数据存储结构从大到小,分为:Tablespace,segment,extend,page(block),row。

    page的另一个名字叫做block,和hadoop中的block类似。

    每个table对应一个tablespace,在tablespace中,index/数据/transaction信息又各自存放于不同的segment。

    每个segment又分64个连续page,每个page固定大小16K。

    4.结论

    存储引擎是按页读取的,也就是说,内容最好在一页上。但是page的子节点是row和索引,而且对于数据存储量,我们是无法控制的。

    所以一切就OUT OF CONTROLL了,以上的疑问没有什么卵用。

    如果一列需要50个字符,就定义varchar(50),如果考虑扩展性,就可以定得再高一些。不必刻意去用63,127和255这样的数字来定义长度。

    5.提醒和声明

    参考5.1官方文档

    http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/

  • 相关阅读:
    mysql 数据库的简单操作 2
    mysql简单操作,增删查改.
    当mysq启动时出现错误1067时应如何解决
    JS中 逻辑或 || 逻辑与 && 的使用方法总结
    编写一段程序,运行时向用户提问“你考了多少分?(0~100)”,接受输入后判断其等级并显示出来。判断依据如下:等级={优 (90~100分);良 (80~89分);中 (60~69分);差 (0~59分);}
    IF的使用
    第一个输出程序 Console.WriteLine
    Day2_and_Day3 文件操作
    linux安装VLAN,系统怎么划分VLAN打标签上交换机
    Python3.5+selenium(11)脚本模块化&参数化
  • 原文地址:https://www.cnblogs.com/AaronCui/p/4904487.html
Copyright © 2011-2022 走看看