美文网首页
char(10) 存储的是字符还是字节?

char(10) 存储的是字符还是字节?

作者: 刀斧手何在 | 来源:发表于2019-05-19 23:45 被阅读0次

面试的生涯中,曾经有过这个下面这段问答:

Q : MySQL char(10) 是什么意思?
A : 字符串定长类型,最大存储10个字符。
Q : 10个字符? 不是字节吗? 那么最大存储多少个字节?
A : 看字符编码,utf8编码就是30个字节,gbk就是20个字节
Q : 那么在utf8编码下,一个字母占几个字节?
A : 一个字节
Q  : 那char(10) 最大存储30个字节,就应该能存储30个字母,不就是30个字符吗?
A :  额 ............ 内心OS,懵逼树下你和我,难道是我记错了,不会呀,不过如果是字节的话,确实就能说通呀。

那么 真相是 怎么样的呢 ?
万事不决,手册来help

help char
image.png

手册已经明确说明 char 10 表示的是字符。 对于一个char(10)的字符,最大允许存储的字节是30个字节(utf8) 编码 ,那么对于字母类型,在utf8格式下是存储是占一个字节还是三个字节,如果是一个字节 最大能存储到30个字符吗?
我们通过建一张模拟表来测一下:

 CREATE TABLE `test_char_1` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `char_str` char(10) DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8; 

插入

insert test_char_1 (char_str) value ("abcdefghij");
insert test_char_1 (char_str) value ("零一二三四五六七八九");
insert test_char_1 (char_str) value ("一a2b3c4d五e");

查询

select char_str,CHAR_LENGTH(char_str),LENGTH(char_str) from test_char_1;
image.png

使用mysql --column-type-info 进入终端查看字段类型占用信息

  • select char_str from test_char_1 where id = 1;


    image.png
  • select char_str from test_char_1 where id = 2;


    image.png
  • select char_str from test_char_1 where id = 3;


    image.png

我们可以看到虽然字母字符10个只占了10个字节,长度最大是30字节,但是最大限制仍旧是以字符来计算的。

image.png

对此 《innodb存储引擎》一书有下面这段说明

从MySQL4.1 版本开始 ,char(n) 中的n 指字符长度,不再表示之前版本的字节长度。也就是说在不同字符集下,char类型列的内部存储可能不是定长数据。

也就是说多于对字节字符集编码,char类型不再代表固定长度的字符串。对于多字节字符编码的char数据类型的存储,innodb存储引擎在内部将其视为变长字符类型

相关文章

  • char(10) 存储的是字符还是字节?

    面试的生涯中,曾经有过这个下面这段问答: 那么 真相是 怎么样的呢 ?万事不决,手册来help 手册已经明确说明 ...

  • sql server char/varchar/nvarchar

    char: 定长,char(10),无论存储数据是否真的到了 10 个字节,都要占用10 个字节。char(10)...

  • MySQL的使用(4)

    数据类型 1.char 定长字符串 char(10) 占用10个字节 括号中的长...

  • 关于String长度的一些总结

    1.正常情况,String内部使用char数组来存储字符串,无论字母还是中文,都按一个char也就是两个字节计算 ...

  • oracle中char,varchar,varchar2的区别

    1.char长度固定,varchar2长度可变。例如,存储字符串“123”,char(10)表示存储的内容占10个...

  • char和vchar的区别

    char定长,vchar不定长,如同是定义char[10],vchar[10],存储abc这三个字符时,char存...

  • Swift中 Character(一)

    OC语言中,定义一个简单的字符可以通过char类型 char类新只占一个字节,因此不能存储复杂的字符,比如汉子"中...

  • 字符串反转

    char类型只能存储单个字符,在C中要存储多个字符组成的字符串得用char*或char[]。区别是char*保存的...

  • 数据类型

    char与varchar区别: 在存储数据的时候是这样的,汉字占两个字节,英文、数字或字符占一个字节。比如,性别男...

  • C++数据类型(二)char字符型

    这一笔记中主要介绍char型字符型的,char是专门存储字符和数字而设计的。如:char a = 'b';char...

网友评论

      本文标题:char(10) 存储的是字符还是字节?

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