mysql 工作上遇到的问题
1.substr函数是从1开始计数,substr(originalStr,1,length)。习惯的写成0,导致截取的字符串有异常。
2.两个table进行模糊查询时map时,like的两端都是参数,例:select * from table1 t1,tables2 t2 where t1.name like '%__参数__%'。直接写在里面肯定是不行的, 会把它认为是要比较的字符串。解决办法:用concat函数:concat('%',t2.name,'%');
3.遇到日期格式的问题,项目上的创建时间,更新时间都是经过一层封装,转为字符串并附上毫米数,例:xxxxxxxxxxxx.000这样的。要把它转为日期格式,拉取报表。用str_to_date函数,str_to_date(str,format)。format:'%Y-%m-%d %H:%i%s'
4.执行计划中的key_len的长度计算。该字段可推断出sql实际执行了哪些索引。具体计算公式如下:int--4个字节,bigint---8个字节,char类型的还要算上编码方式,如char(20) utf8,则长度为60。 varchar因为是可变长度在char的基础上还要加上两个字节,text和blog一般不会建索引,即使建了也是截取的前缀,计算方式同char。如果定义的索引列包含bull值,需要再加一个字节。
get到了这个,赶紧拿个表验证下:
接着看下字段类型:(出乎意料)
官方文档表示:decimal计算方式有点特别:decimal(M,D),M表示总的位数,D表示小数点后面的位数。如decimal(19,0):表示总的长度为19位,小数点后面没有。小数点前和后的数字分开存储,且已9位数字为一组,用4个字节保存,如果低于9位数,需要的字节如下:
0-------0
1-2-----1
3-4-----2
5-6-----3
7-9-----4
举个栗子:decimal(20,6)==》小数点左边14,右边6位==》左边分组5+9,需要3+4个字节,右边需要3个,所以长度为10个。
再拿上面的decimal(19,0)来算:左边为9+9+1 需要4+4+1个字节,再加上可以为null,再加1个,总共4+4+1+1=10.完美。
5.关于sql.date和util.date的问题
后者是前者的父类,前者用于在sql(jdbc)中对日期格式的处理,但是在java程序中一般使用后者。