MySQL常见面试题——字段相关
更新: 3/6/2025 字数: 0 字 时长: 0 分钟
整数类型的unsigned的作用
unsigned即无符号形,最大的意义在于可以让那些没有负数的字段的最大容量扩充到原来的2倍(比如ID)
CHAR和VARCHAR的区别
char是定长字段,varchar是变长字段
所谓变长字段即指在设定好长度后,char会将不满足长度的部分用空格填充,而在检索出结果后则会将多余的空格去掉。
而反观varchar,仅仅会用一到两个额外的字节存储长度,并不会占用多余的空间。
值得注意的是,char和varchar在记录最大字符时是不区分中英文的,不论是一个字母还是一个汉字甚至是一个emoji,均代表一个字符。
char类适合存储固定长度的数据(因为相对varchar少使用了半个字节(这半个字节是varchar用来存储字符串长度的))
VARCHAR(100)和 VARCHAR(10)的区别是什么?
没有区别(
虽然存储相同长度的数据二者没有任何区别。但是在进行内存操作时,varchar通常会分配固定大小的内存块来保存值。(使用内存处理时会按最大值算)
Decimal和FLOAT/DOUBLE的区别是什么
类似于BigDecimal和Double的关系,Decimal没有精度损失,适合精确的数据
为什么不推荐使用TEXT/BLOG
首先我们必须要知道的是,VARCHAR的最大长度为65,535,这个数量级已经可以应付绝大多数的场景。
而且TEXT和BLOG存在许多缺陷
- 不能使用默认值
- 临时表只能创建在磁盘上(对分库分表不友好)
- 检索效率低
- 不能直接创建索引
- ........
所以如果真的有大文本的存储需求,或许换一种数据库会是更好的选择(Cassandra或是MongoDB)
DATETIME和TIMESTAMP的区别
TIMESTAMP与时区有关,DATETIME与时区无关
TIMESTAMP占用四个字节,DATETIME占用八字节,进而导致DATETIME可以存储1000-01-01 00:00:00 ~ 9999-12-31 23:59:59而TIMESTAMP只能存储1970-01-01 00:00:01 ~ 2037-12-31 23:59:59的时间
不能发现其实已经快到TIMESTAMP的上限了。
因此我们一律推荐使用DATETIME
NULL和 ‘’(空字符串)的区别
在MySQL中NULL的含义其实不是空,而是不确定值,而空字符串是一个确定的值(就是空),因此才会延伸出了以下区别:
- 两个NULL在等于判断中为不同,因此单独使用 is null 和 is not null来判断,而空字符串可以比较
DISTINCT
,GROUP BY
,ORDER BY
时,NULL
又被认为是相等的,因为均被划分为同一组(总不能一个NULL一组,那就失去了分组的意义)- 空字符串长度为0,但NULL会占用空间
- 计算类(AVG,MAX.......)的聚合函数会忽略NULL(因为不确定,所以无法算),如果参数是 (
COUNT(*)
),则会统计所有的记录数,包括NULL
值;如果参数是某个字段名(COUNT(列名)
),则会忽略NULL
值,只统计非空值的个数。
BOOLEAN的显示方式
MySQL数据库中无专门的BOOLEAN,而是用tinyint(1)的0和1来分别存储/表示false和true。