【面试】--mysql 默认隔离级别 where 语句最长多少字符,int(10)10表示多大,char(128)128多大(357)

1数据库InnoDb的默认隔离级别:

  • 未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
  • 提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)
  • 可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读
  • 串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
2 where in()最长多长?

设置环境变量max_allowed_packet 可设置


3 sql定义int(数字)含义

int(10): 之前总以为其中的10表示字段所能表示的位数,其实发现理解错了,这个10表示的是数据显示的长度为10位。

 

如:int(2):并不表示数据的大小最大为99,其最大的值和int表示的最大值一样,只是表示查询时显示的结果长度为2位

 

int

从 -2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) 的整型数据(所有数字)。存储大小为 4 个字节。int 的 SQL-92 同义字为 integer

无符号时,表示的范围为:0~4294967295

有符号时,表示的范围为:-2147483648~2147483647


4 varchar长度

一. varchar存储规则:

4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 
5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节 
Mysql4中最大也不过是20个字节,但是Mysql5根据编码不同,存储大小也不同。  

二. varchar和char 的区别:

区别一,定长和变长

char 表示定长,长度固定,varchar表示变长,即长度可变。当所插入的字符串超出它们的长度时,视情况来处理,如果是严格模式,则会拒绝插入并提示错误信息,如果是宽松模式,则会截取然后插入。如果插入的字符串长度小于定义长度时,则会以不同的方式来处理,如char(10),表示存储的是10个字符,无论你插入的是多少,都是10个,如果少于10个,则用空格填满。而varchar(10),小于10个的话,则插入多少个字符就存多少个。
varchar怎么知道所存储字符串的长度呢?实际上,对于varchar字段来说,需要使用一个(如果字符串长度小于255)或两个字节(长度大于255)来存储字符串的长度。但是因为他需要有一个prefix来表示他具体bytes数是多少(因为varchar是变长的,没有这个长度值他不知道如何读取数据)。 

区别之二,存储的容量不同

对 char 来说,最多能存放的字符个数 255,和编码无关。
而 varchar 呢,最多能存放 65532 个字符。VARCHAR 的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是 65,532字节 

  

在MySQL中用来判断是否需要进行对据列类型转换的规则 

1、在一个数据表里,如果每一个数据列的长度都是固定的,那么每一个数据行的长度也将是固定的. 

2、只要数据表里有一个数据列的长度的可变的,那么各数据行的长度都是可变的. 

3、如果某个数据表里的数据行的长度是可变的,那么,为了节约存储空间,MySQL会把这个数据表里的固定长度类型的数据列转换为相应的可变长度类型.例外:长度小于4个字符的char数据列不会被转换varchar类型 

三. MySQL中varchar最大长度是多少? 

这不是一个固定的数字。先简要说明一下限制规则。 

1、限制规则

字段的限制在字段定义的时候有以下规则: 

a) 存储限制 

varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535字符。 

b) 编码长度限制 

字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766; 

字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。 

若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。 

c) 行长度限制 

导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535bytes。若定义的表长度超过这个值,则提示 

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。

由字符集来确定,字符集分单字节和多字节
Latin1 一个字符占一个字节,最多能存放 65532 个字符
GBK 一个字符占两个字节, 最多能存 32766 个字符
UTF8 一个字符占三个字节, 最多能存 21844 个字符
注意,char 和 varchar 后面的长度表示的是字符的个数,而不是字节数。

2、计算例子

举两个例说明一下实际长度的计算。 

a) 若一个表只有一个varchar类型,如定义为 

create table t4(c varchar(N)) charset=gbk; 

则此处N的最大值为(65535-1-2)/2= 32766 个字符。 

减1的原因是实际行存储从第二个字节开始’; 

减2的原因是varchar头部的2个字节表示长度; 

除2的原因是字符编码是gbk。 

b) 若一个表定义为 

create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8; 

则此处N的最大值为 (65535-1-2-4-30*3)/3=21812 

减1和减2与上例相同; 

减4的原因是int类型的c占4个字节; 

减30*3的原因是char(30)占用90个字节,编码是utf8。 

如果被varchar超过上述的b规则,被强转成text类型,则每个字段占用定义长度为11字节,当然这已经不是“varchar”了。 

则此处N的最大值为 (65535-1-2-4-30*3)/3=21812

create table t4(c int, c2 char(30), c3 varchar(21812)) ENGINE=InnoDB DEFAULT CHARSET=utf8


你可能感兴趣的:(java)