环境:
- 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,一般说的是char
、varchar
、tinytext
、text
、mediumtext
、longtext
。
但是mysql文档中将binay
、varbinary
、tinyblob
、blob
、mediumblob
、longblob
以及enum
、set
也归到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[]
。