mysql:列类型之string

2022-02-17 14:11:03

环境:

  • window10
  • vs2022
  • .net 6
  • mysql 8.0.25
  • DBeaver

参考:
《博文:mysql字符集编码和排序规则》
《博文:细说ASCII、GB2312/GBK/GB18030、Unicode、UTF-8/UTF-16/UTF-32编码》
《mysql:11.3 String Data Types》

在mysql中说string,一般说的是charvarchartinytexttextmediumtextlongtext
但是mysql文档中将binayvarbinarytinyblobblobmediumbloblongblob以及enumset也归到string一类了。也许是因为它们有相似吧。

其实,binary、blob是字节,而enum、set是整数,不知道为什么mysql文档中要把它们归为一类。

基础支持:字符集编码和排序规则:

涉及到字符串的地方就要涉及到两个注意点:字符集编码排序规则。它们一个影响存储的字节,一个影响不同字符间的排序。可参考:《博文:mysql字符集编码和排序规则》

1. char类型

char(M):M取值范围0-255,默认1,这里的M代表的是字符,即:这一列用的是ascii码,那么它最多占用255*1=255个byte,如果是utf8mb4,则最多占用255*4=1020个字节。

存储的细节:

  • 当mysql存储时,对于给定字符串不满足255个长度时,将在末尾补齐空格插入;
  • 当mysql取数据时,默认会自动剪除末尾的空格(也可以通过启用PAD_CHAR_TO_FULL_LENGTH模式,让mysql补齐空格后返回255个长度的字符串,但一般没人这么做);

2. varchar类型

varchar(M):M取值范围0-65535,注意:这里的M也是代表的字符,但65535只是它的理论最大值,实际值却达不到(还要受到mysql行大小的限制,65,535 bytes,which is shared among all columns)。

如:这一列用ascii和用utf8mb4是不一样的,如果用ascii那么可以存65535个字符,而M的最大值是65532,如果用utf8mb4的话实际可能只存65535/4=16383个字符,M的最大值也是16383,参照mysql文档的描述:
在这里插入图片描述

和char类型相比: varchar类型的末尾空格不会被自动剪除和补齐。

注意:sqlsever中对 char(M) 这种定长的字符串也会用右侧的空格补齐。
另外,mysql和sqlserver中均不会对varchar这种变长的字符串右侧补齐。

3. tinytext类型

最多存储255个字节,如果全存汉字,那么最多存储85个字符,如:“啊”,86个就报错。

4. text类型

最多存储65,535个字节,如果全存汉字,那么最多存储65535/3=21845个字符,如:“啊”,21846个就报错。

另外: 定义时,也可以使用text(M)这种形式,不过mysql会根据M的给定值将它自动转换为其他类型,如:text(6) 被转换成 tinytext。(其他可用来转换的类型有 text、mediumtext、longtext)

5. mediumtext类型

最多存储16,777,215个字节,如果全存汉字,那么会存储16,777,215/3=5592405,如:“啊” 5592406个就报错。

6. longtext类型

最多存储4,294,967,295 or 4GB 字节,和mediumtext类似,存储空间大些。

7. binary、varbinary、tinyblob、blob、mediumblob、longblob类型

binary(M) 和 varbinary(M) 类似于char(M) 和 varchar(M) ,只不过前者存储的是字符串,后者存储字节。
其他的类型也与字符串的对应,如下表:
在这里插入图片描述

8. 在c#中的用法

对于char、varchar、text等类型自然使用c#中的string
对于binary、varbinay、blob等类型自然是用c#中的byte[]

  • 作者:jackletter
  • 原文链接:https://blog.csdn.net/u010476739/article/details/122925961
    更新时间:2022-02-17 14:11:03