在数据库系统概论第四版第三章96頁的字符匹配任意字符当中指出_(下划线)代表任意单个字符。根据书中前面的sql语句建立表格并插入数据,执行查找姓刘的同学的记錄
现在没有任何问题是我们想要的结果,但是如果多打一个_(下划线)结果会是什么样呢
原本应该只匹配任意字符三个字的Sname 的记录才輸出,然而两个字的Sname的记录也输出了
这结果让人感觉很蛋疼,为什么会是这个结果呢我觉得这是这本的bug。那么问题究竟出来哪呢?
我们看一下建表的语句以及定义的数据类型:
我们可以看到Sname的数据类型是CHAR类型问题就出在这里。我们首先看一下CHAR和VARCHAR的区别(参考网友解释):
对英文(ASCII)字符占用1个字节对一个汉字占用2个字节,CHAR存储定长数据很方便CHAR字段上的索引效率极高,比如定义char(10)那么不论你存储的数据是否达 到了10个字节,都要占去10个字节的空间因为是固定长度,所以速度效率高比如定义char(10),那么不论你存储的数据是否达到了10个字节都要占去10个字节的空间。因为是固定长度所以速度效率高。
2. VARCHAR存储变长数据如果一个字段可能的值是不固定长度的我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的VARCHAR类型的实际长度是它的值的实际长度+1。为什么“+1”呢这一个字节用于保存实际使用了多大的长喥。
注:由于char是以固定长度的所以它的速度会比varchar快得多!但程序处理起来要麻烦一点,要用trim之类的函数把两边的空格去掉!
我们可以看到根據书中定义的Sname是定长CHAR型,长度为20那么当存入一条记录,其中Sname是“刘晨”时在数据库中“刘晨”的存储形式是前四个字节存姓名,后面18芓节用空格补齐而空格也是字符,_(下划线)也匹配任意字符它所以执行sql语句进行模糊查询时将字符串长度小于3的也匹配任意字符出來。
那么如何解决这问题呢我们重新建一个表,Sname定义为VARCHAR(20)类型看一下结果:
我们可以看到,定义为VARCHAR类型后由于字符串的长度就是存储長度,不存在用空格补全问题所以输出结果正常。可以看出数据的定义还要是非常小心的那么我们怎么可以避免这个问题我,我认为:
首先要选择合适的数据类型。其次用先对安全的方法得到自己想要结果
语句,同样是在课本定义的数据库中得到我们想要的结果