嗯,你上面的回答总体上是没有问题的。
不过我还有几个问题,想问你一下。假如我的建表语句是这样的:
嗯,两条SQL都能执行成功的!创建数据表时你指定了char(5),它的意思是这列可以存储5个字符而不是5个字节。
对数字来说它是被包含在utf8中的,并且每个数字只会占用一个byte,而中文也会被包含utf8中的,每个中文占用3个byte。
综上:当charset为utf8时,char(5) 这一列可以存储的字节范围是[5*1,5*3],也就是[5,15]。所以上面的两个SQL都能执行成功。
嗯,是的
。大家都在说varchar存储可变长度的字符串、char用来存储不可变长度的字符串。其实当使用的字符集编码不同时,char能存储的字节数是会变化的!那你在看下面的这个例子:
创建表:
create table t(a varchar(2)) charset=utf8 engine = innoDB;
插入数据:
你注意,a列为varchar类型,且的长度为2。
你绝对上面的insert sql会执行成功嘛?会不会出现"abcd"被截断成"ab",然后仅仅将"ab"存储进数据库的情况?
嗯,很明显varchar的期望长度是2,但是你插入的字符串长度为4。这时sql是否能执行成功取决你 sql mode。
当sql mode为严格(strict)模式时。下图中的sql_mode中的 strict_trans_tables表示开启了严格模式