嗯~
对于数据库来说,字符串的比较是很重要的。索引的排序规律,就是按照这个,因此,对字符型字段,升序索引后,"11"必然在"12"之前,而所有的"11"必然是全部在一起的。对逻辑比较=,结果与字符串的左右位置有关,"ab"="abc"(.F.)的结果与"abc"="ab"(.T.)是不一样的,这给很多编程者制造麻烦,除非有足够的敏感性和经验。但"ab"=="abc"这样的,不论左右怎么调换,结果都为假。因此在SQL查询中,在where中使用了==算符的无法优化运行,而使用=就可以,如何使用,看编程的实际目标了。前者的现象,正是与C字符串比较的算法有关,它就是以左边的为主,依次提取两边对应位置的字符进行比较,如果右边的字符数较少,就用0字符补足,而0字符永远比左边的小,故长字符较大。
补充一下:在索引文件中,排序之所以重要,是因为它可以提高搜索效率。正如前面所说的排列规律,所有"11"都在"12"之前而且全部放在一起,那么只要我们用seek指令把记录指针快速定位到第一个"11"记录处,然后往下逐个检索,由于全部是"11"的记录必然有限,那么只要循环遇到非"11"的记录就终止,则循环次数就是有限的,这比在全部分散的记录中遍历一次的效率高得多(在一千条记录以内,locate和seek的效率相差无几,但记录数越大,后者的效率就高得越多,只要seek到了,往下顺序检索100条以内的记录,不过是瞬间之事)。SQL的where查询,之所以对有索引的数据库效率高,就是它自动利用了这样的特性,而我们手动编程,也同样可以利用这样的特性提高效率,在构造数据库时,也要优先考虑建造有这种特性的数据结构。
[
本帖最后由 TonyDeng 于 2012-3-9 22:34 编辑 ]