美文网首页数据库
MySQL字符类型

MySQL字符类型

作者: 乔治大叔 | 来源:发表于2018-09-12 11:44 被阅读7次

    列类型

    • 整型(默认是有符号的)
    类型 字节数 有符号型范围 无符号型范围(unsigned)
    tinyint(M) 1字节 -128~127 0~255
    smallint(M) 2字节 -32768~32767 0~65535
    mediumint(M) 3字节 -8388608~8688607 16777215
    int(M) 4字节 -2147483648~2147483647 4294967295
    integer 4字节
    bigint(M) 8字节 -9223372036854775808~9223372036854775807
    float(X) 浮点型 4 -3.4E38~3.4E38(7个有效位) 如果 X < = 24 或 8 如果 25 < = X < = 53
    float 4 个字节
    double 双精度实型 8 个字节 -1.7E308~1.7E308(15个有效位)
    double precision 8 个字节
    real 8 个字节
    decimal(M,D)数字型 M字节(D+2 , 如果M < D) 128bit,不存在精度损失,常用于银行帐目计算(28个有效位)
    numeric(M,D) M字节(D+2 , 如果M < D)

    日期和时间类型

    类型 字节数
    DATE 3 个字节
    DATETIME 8 个字节
    TIMESTAMP 4 个字节
    TIME 3 个字节
    YEAR 1 字节

    字符串类型

    类型 字节数和范围
    CHAR(M) M字节,1 <= M <= 255
    VARCHAR(M) L+1 字节, 在此L <= M和1 <= M <= 255
    TINYBLOB, TINYTEXT L+1 字节, 在此L< 2 ^ 8
    BLOB, TEXT L+2 字节, 在此L< 2 ^ 16
    MEDIUMBLOB, MEDIUMTEXT L+3 字节, 在此L< 2 ^ 24
    LONGBLOB, LONGTEXT L+4 字节, 在此L< 2 ^ 32
    ENUM(‘value1’,’value2’,…) 1 或 2 个字节, 取决于枚举值的数目(最大值65535)
    SET(‘value1’,’value2’,…) 1,2,3,4或8个字节, 取决于集合成员的数量(最多64个成员)

    1 整型
    如何验证存储的数据范围 ? 编程计算机 或者 python代码
    ⽆符号与有符号为什么⼤大⼩小不同? 因为需要用⼀个bit存储符号
    默认是有符号好使⽆符号呢?
    来⼀个测试,创建表 添加tinyint类型字段 插⼊255 发现最大还是127 说明
    默认是有符号的 如何设置有符号?
    创建表是在数据类型后⾯添加unsigned 选择哪个来使用呢?
    常规int就⾜够使⽤了
    全⽤bigint也行 只不过会多占一些空间,但是硬盘好像也不值钱 ⽽而且对你的程序运行速度没啥影响
    最好是根据你的实际情况 ⽐如存年龄tinyint就最够
    思考: 可以给整型加上宽度限制吗? 可以,尝试一下,在建表时 为int指定宽度为更大的范围
    插⼊超过int范围的数据
    查看结果 发现任然只能存储4字节最大值
    也就是说: 整型的数据能保存的数据范围由数据类来决定
    那么宽度对于整型⽽言有什么意义吗?
    对于整型⽽言 宽度用于控制显示的长度
    例如 int(10) 则表示显示的时候 如果不足10位则不足10位
    尝试一下 发现没什么⽤ 因为你仅仅告诉她需要填充10位 并没有说⽤什么 填充
    所以 要控制显示宽度 不仅需要指定宽度还要指定 zerofill 以0填充 有没有发现⼀个问题 我们之前创建的表并没有指定显示宽度 那他有没有呢?
    desc查看一下
    有⽽且刚好就是 能够存储的最大范围的长度 所以如果你使用的是整型 则
    没有必要指定显示宽度

    2浮点
    float(m,d) 4字节
    double(m,d) 8字节
    decimal(m,d) 根据长度确定
    在浮点类型中 后面的m表示整体⻓度 d表示小数长度 注意:是长度和字节数⽆关 那么整数部分的长度就是m-d
    例例如 float(5,3) 最⼤能存出 99,999
    三种类型的区别
    相同处: ⼩数部分最大精度都是30 不同处:
    1.float double 总长度最大为255
    2.float double 都是不清准的小数 decimal是精准的 3.double的精度⽐float⾼一些
    如何取舍根据实际情况 如果对精度要求⾼ 比如银行系统 就是用decimal 否则一般使用float
    3char和varchar
    宽度⽤于限制字符的长度(字符数) char 为定⻓
    超出范围则报错 不足则用空格在右边补⾜长度 varchar为变⻓
    超出范围则报错 不足则有几个字符就存几个
    测试:
    create table t10(a char(4),b varchar(4)); insert into t10 values("a","a");
    select *from t10;
    decimal为65

    发现并没有区别!
    介绍一个函数 lenght(列名) 可以查询某⼀列的长度 select char_length(a),char_length(b) from t10; 发现⻓度也相同!
    这是为什么?
    因为mysql⾃动把后面的空格给干掉了了! 那怎么能看一下呢?
    需要修改sql_mode 增加 PAD_CHAR_TO_FULL_LENGTH set global sql_mode =
    "PAD_CHAR_TO_FULL_LENGTH,STRICT_TRANS_TABLES" 再次查看:select char_length(a),char_length(b) from t10; 由此可以看出定长的char mysql的确⾃动将后⾯面的空格处理掉了
    再来看一个例子:
    create table t5(name char(4)); insert into t5 value("yh") insert into t5 value("egon")
    select *from t5 where name = "yh "
    无论后面有多少个空格都会⾃动去掉
    换⼀种写法:
    select *from t5 where name =like "yh " 此时就不行了 自动去除空格仅在第一种写法中生效
    总结:使⽤用char类型时 如果数据长度不足则会⾃动补⾜ 在读取数据时 mysql会自动去除其中的空格
    因为这是mysql内部的一个存储机制 与我们的应⽤程序逻辑⽆关
    注意的是 如果数据不足规定长度 使用like 来模糊匹配时 硬盘上存储 的空格也算作有效字符
    所以我们应该在后面加上% 表示后面任意长度的字符都匹配 像这样 :select *from t5 where name =like "yh%" 当然你也可以使用_ 表示一个任意字符 模糊匹配后续会详细讲

    如何抉择?
    你觉得那种类型好呢? 到底哪种好我们得分析一下 相同点:都是字符类型 不同点:
    1.char 是固定长度 会浪费空间 存取速度快
    2.varchar 是可变长度 节省空间
    存取速度慢 思考 可变长度如何实现?
    假设我们有两个类型 char(4)
    存储: axx bx bbbbcccc varcahr(4)
    存储:axxbxbbbbcccc
    如何取出某个名字?
    需要在前面保存字符串的长度 (1btyes+axx)(1bytes+bx)(1bytes+bbbb)(1bytes+cccc) 长度最⼤为两个字节2bytes
    这就意味着 一些情况下 varchar更占用空间 并且需要计算字符串长度 所以存取速度慢

    TIMESTAMP 自带默认状态,默认时间就是当前时间

    相关文章

      网友评论

        本文标题:MySQL字符类型

        本文链接:https://www.haomeiwen.com/subject/rmcvgftx.html