1、基本知识
1.1 MySQL数据库中的 char 与 varchar的区别是什么?
MVSQL中的 char 和 varchar 都是用于存储字符串的数据类型,但它们在存储方式和性能上有所不同。以下是它们的主要区别:
第一点呢,就是存储方式不同:
·char:定长字符串,长度是固定的,不管实际存储的字符串长度如何,都会占用固定长度的存储空间。如:char(10) 会始终占用10个字符的空间。
varchar:变长字符串,长度不固定。占用的空间与实际存储的字段长度有关。如:varchar(10) 表示最多可以存储10个字符,如果存储的字符串长度不足10,假设为5,只会占用5个字符空间。第二点呢,就是性能不同:
,对于char,由于其固定长度,操作会快些,但是会存储浪费磁盘空间的问题
,对于varchar,由于长度可变,操作时会相对慢一点,但是可以节省磁盘空间,尤其是存储的数据长度不固定时。
所以呢,我们在设计表结构的时候,需要根据具体的场景来选择具体的数据类型。 就比如啊,如果是手机号、身份证号这样的字段,由于长度固定,我们就直接选择char类型即可,并指定长度,如:char(11)、char(18)。再比如,像用户名、备注信息这类长度不固定的,我们直接选择varchar类型,长度根据页面原型和需求文档确定。
1.2 什么是事务以及事务的四大特性?
·必答内容:
事务是数据库中的基本概念,是指一组操作的集合,而这一组操作要么同时成功,要么同时失败,从而保证数据库中数据的正确性和完整性。
也就是我们常说的ACID,分别是:原子性、一致性、隔离性、持久性。那接下来,我那事务呢,具有四大特性,就分别来聊聊这四大特性。
1).原子性指的是事务中的这一组操作,是不可分割的最小操作单元了,操作要么全部成功,要么全部失败。
2).一致性是指在事务操作的前后,必须使数据处于一致的状态。
3).隔离性指的是数据库中提供了隔离机制,保证事务在不受外部并发操作的影响的独立环境中运行。
4).持久性就比较简单了,就是事务一旦提交或回滚了,它对数据库的改变就是永久的。
可能继续发问的问题:
1).你刚才提到了并发事务,那并发事务回引发哪些问题?
并发事务引发的问题,主要有这么几个:
脏读:就是一个事务,读取到了另一个事务还没有提交的数据
不可重复读:指的是在同一个事务中,先后读取同一条记录,但两次读取的数据不同。幻读:指的是一个事务按照条件查询数据时,没有对应的行,但是插入时,又发现这行数据已经存在了好像出现了幻觉。
2),如何解决这些问题呢?
那这些问题,在数据库系统中都已经解决了。在数据库中提供了不同的隔离级别来解决这些问题,分别有以下几种:
READ UNCOMMITED:读未提交。这种隔离级别下,会出现脏读、不可重复读、幻读问题,READ COMMITED:读已提交。这种隔离级别,解决了脏读问题,但是会出现不可重复读、幻读问题REPEATABLE READ:可重复读。这种隔离级别,解决了脏读、不可重复读问题,但是会出现幻读问题SERIALIZABLE:串行化。解决了上述所有的并发事务问题。而在MySQL数据库中,默认的隔离级别是 REPEATABLEREAD(可重复读)。3).那为什么没有用SERIALIZABLE(串行化) 这种隔离级别呢?其实,隔离级别,也不是越高越好,因为隔离级别高了,确实可以解决并发事务引发的问题,但是隔离级别越高性能也越低。