将表格中的句子输入到横线上,
注意大小写和标点符号。
首先创建一个简单的测试环境:
问题产生了。由于函数索引一个常数输入参数的不同,造成了Oracle无法使用函数索引。这时,Oracle认为索引扫描得到的结果是不正确的,因此,即使使用HINT,Oracle也不会采用索引扫描。使这个查询语句使用索引的办法就是在增加日期转换格式为小写的函数索引。
问题似乎解决了,但是新的问题出现了,如果输入的日期格式是大小写混写怎么样。
而且lfree的测试发现了一个更有趣的现象。
仔细观察上面两个SQL语句,当格式为YYYY-MM-Dd时,无法使用YYYY-MM-DD格式的索引。这个很容易理解,输入不同吗。但是格式为yyyy-mm-dD时,却可以使用yyyy-mm-dd的索引,这是为什么呢?
经过一系列测试后,总结出了日期转换函数格式参数的大小写规则(终于引入正题了)。并发现一开始对CBO函数索引的理解还不算很清楚,对CBO的聪明程度有点低估了(当然,总体来说,还不算太聪明)。
刚开始测试时发现,即使是下面这种查询也可以使用索引:
似乎Oracle只关系第一个字母。但是综合考虑YYYY-MM-Dd的情况,似乎又不是这样。于是得到了Oracle会找到第一个小写字母为止的推论。
在测试过程中,找到了一个更好的方法来确定Oracle使用字符串转换的格式。
上面这种情况也是对的,但是下面列出的情况又不符合了。
显然,这种情况又和刚才得到的推论冲突了。似乎这种规律只对前两位有效。
突然我明白了Oracle所定义的规则。由于英文会出现首字母大写的情况,所以Oracle在判定的时候首先判断第一位的大小写状态,如果是小写,就不继续判断后面的内容了,而把整个字符串都当作小写。如果第一位是大写,Oracle继续判断第二位,如果也是大写,那么Oracle就把整个字符串都当作大写,如果第二位是小写,则Oracle认为这种情况是首字母大写,就把第一个字母当作大写,而剩余字符做小写出来。
一开发同事在linux下调一个程序老是报错说找不到表,但是登陆mysql,show tables查看明明是已经创建了这张表的!!如下:
所以在不同操作系统中为了能使程序和数据库都能正常运行,最好的办法是在设计表的时候都转为小写!!
为了避免大小写引发的问题,一种推荐的命名规则是:在定义数据库、表、列的时候全部采用小写字母加下划线的方式,不使用任何大写字母。