mysql 数据库表设计时遇到问题的思考

本文适用于mysql数据库 InnoDB存储引擎。

  • mysql 每个表最多有多少列
    每个表有4096列的硬限制,但是对于给定的表,有效最大值可能更小

There is a hard limit of 4096 columns per table, but the effective maximum may be less for a given table and depends on the factors discussed in Section C.10.4, “Limits on Table Column Count and Row Size”.

  • mysql支持什么数据类型
    数字类型,日期和时间类型,字符串(字符和字节)类型,空间类型和 JSON数据类型

    需要注意的是:

  • 对于整数类型,M表示最大显示宽度。对于浮点和定点类型, M是可以存储的总位数(精度)。对于字符串类型, M是最大长度。允许的最大值M取决于数据类型。

    例如
    int(5) insert插入数据 100000 也可以插入成功,因为 对于整数类型,M表示最大显示宽度
    这里的最大显示宽度是指 int(5) insert插入数值 1 ,取出数据应显示 00001 (Navicat 应该是做了数据处理)

  • varchar char

    • CHAR和VARCHAR类型的声明,其长度指示要存储的最大字符数。例如, CHAR(30)最多可以容纳30个字符
    • 一个长度CHAR列被固定在创建表声明的长度。长度可以是0到255之间的任何值。当CHAR 存储值时,它们用空格填充到指定长度。
    • VARCHAR列中的 值是可变长度的字符串。长度可以指定为0到65,535之间的值。a的有效最大长度 VARCHAR取决于最大行大小(65,535字节,在所有列之间共享)和使用的字符集
      mysql 数据库表设计时遇到问题的思考_第1张图片
      为什么是 varchar(255) 而不是 varchar(256)
      请参考
    • https://stackoverflow.com/questions/5898904/mysql-different-treatment-between-varchar255-and-varchar65536
    • https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html#data-types-storage-reqs-strings (一定要了解,mysql对于字符串存储的要求)

    如果指定VARCHAR(60),则表示最多可以容纳60个字符。如果它包含较少的字符,让我们说50 - 然后MySQL使用50个字节来存储数据而不是60。

    与CHAR(60)完全相反 - 无论要保存的字符串长度如何,它都会保留60个字节。

    如果将其指定为VARCHAR(255),则表示该列将保留1个字节+字符串字节的长度。那1个字节表示字符串的长度。1个字节=您可以存储0到255个值(2到8的幂= 256)。

    对于大于255的VARCHAR,您需要以某种方式存储正在使用的字节数。由于1个字节最多只能存储256个不同的值(0 - 255),因此需要使用两个字节。(2的16次幂)两个16的功率= 65536,这意味着您可以存储任何大小为该大小的字符串,然后它会加上2个字节来表示字符串的长度。

    VARCHAR(65536)并且你使用200个字节来存储文本 - 你就浪费了VARCHAR(65536)使用的1个额外字节

    它还会导致处理开销和使用额外的RAM。

    那么对于大的文本应该使用什么类型?TEXT吗。他存储的上限又是多少?

    题外话

    1. 为什么 1个字节最多只能存储256个不同的值(0 - 255)个值

      • 1 byte 等于 8个bit
      • 每个bit 为一个数字 0/1
      • 8个bit 就是8个0和1的序列 00000000到11111111,每位的取值都有2钟情况 因此是 256 个情况
    2. varchar(255)能存储多少中文字符

      • UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节
      • Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。中文标点占两个字节,英文标点占两个字节

      这与mysql的版本以及存储引擎有关,参考 官方文档

你可能感兴趣的:(mysql)