关于数据库字段长度的探索:
- length和like和rlike对于限制字段长度的原理与区别
- length
- like、rlike
- ==like的_下划线通配符==
- ==rlike的正则表达式==
- ==regexp、regexp_like的正则表达式==
length和like和rlike对于限制字段长度的原理与区别
探索之前先简单介绍下:
length函数可以返回每条数据的字段的长度,like和rlike一般用作模糊匹配关键字查询
length
length返回字段长度的原理是与每个数据库对于字符编码方式的设计挂钩的,计算的是字节,一般都是utf8,这样数据库里一个中文或者一个中文符号就占用3个字节,其他的英文、数字、英文符号、空格就只占用1个字节。
这样的话和我们想的就不一样,我们想的就是不管是中文英文数字还是符合就是长度为1个。在mysql里就有char_length这个函数实现这个功能。
但在oracle里length一个中文就是返回1。对于这种length函数不通用与大部分数据库的标准写法时,我们就可以间接使用模糊查询来避免换数据库后带来的长度不一致的困扰。
like、rlike
在这里我就不介绍常用的功能了,就只针对限制字段长度,不管是中文、英文、数字、还是符号,来介绍一个公用的写法:
like的_下划线通配符
我们知道like有下划线的通配符,一个下划线表示任意一个字符。
如下表里,姓名字段里一个两个三个四个五个字符的都有。
/**这里like了两个下划线就表示姓名只有两个任意的字符**/SELECT * FROM 学生基本信息
WHERE STUNAME LIKE '__'
rlike的正则表达式
据我了解like下划线的方式只能限定固定长度,比如我们想要2到4个长度的姓名时,我们就可以使用rlike:
RLIKE ‘^.{n,m}$’
RLIKE '^.{n,m}$'^表示开头
.在rlike的正则表达里表示匹配任意字符
{n,m}的规则就是n<=m
最后$表示结尾^.就是以任意字符开头
^.{2,4}表示以任意2到4个字符开头
不写这个$的话这个{2,4}里的4就没有意义了 就只有里面的2有意义RLIKE '^.{2,4}$' 表示字段里最少有2个最多有4个字符
regexp、regexp_like的正则表达式
如果数据库不支持rlike,例如oracle就不支持,就可以用regexp或者regexp_like来代替rlike
REGEXP_LIKE(字段名,'^.{n,m}$')
字段名 REGEXP '^.{n,m}$' 这两个的意思和功能和 RLIKE '^.{n,m}$' 一样
查询姓名只有一个字和两个字的数据: