以下是引用TonyDeng在2012-3-2 15:09:43的发言:
你还是没到SQL测试过?
昨天查VFP6.0帮助文件,这种情况与SET COLLATE TO
的设置有关
在国际化应用程序中排序数据
在创建国际化数据表后,需要检查应用程序是否排序正确。对数据如何排序取决于表所用的代码页,因为代码页指定了可用的排序次序或排序序列。
深入了解排序次序
排序次序包容了不同地区的排序规则,允许各种语言的数据正确地排序。在 Visual FoxPro 中,当前的排序次序决定了字符表达式比较的结果和在索引或排序表中记录的位置。
注释 在双字节字符 (DBCS) 环境中,排序的方式不同。有关详细内容,请参阅本章稍后的“排序 DBCS 数据”。
因为不同的排序次序会产生不同的排序结果,因此应按下表选择合适的排序次序。
Unsorted Machine General Spanish
!@#$ space space space
1234 !@#$ !@#$ !@#$
space 1234 1234 1234
Caesar Caesar äa äa
cæsar Car ab ab
Strasse Char äb äb
straße Czech Caesar Caesar
Car Strasse cæsar cæsar
Char Ab Car Car
Czech cæsar Çar Çar
ab straße Char Czech
Çar Çar Czech Char
äa Äa Strasse Strasse
äa Äa straße straße
排序次序准则
在选择排序次序时要考虑如下问题:
如果希望对国际化字符进行正确排序,应避免使用 Machine 排序次序。因为 Machine 排序次序按国际化字符的 ASCII 码顺序排序。例如,注意 Çar 是排在 straße 之后。
有注音符号的字符与没有注音符号的字符排序不同。例如,在“General”和“Spanish”排序次序中,注意 äa 排在 ab 之前,而 ab 排在 äb 之前。
连字如 ß ,按等价的分解字符来排序。例如 straße 与 Strasse 排序结果相同,而 Cæsar 与 Caesar 排序结果相同。
在某些语言中,两个字符做为一个字符排序。例如,在西班牙语中,Char 中的 Ch 作为 C 和 D 之间的一另个字母进行排序。
下面几节说明如何指定排序次序,检测当前排序次序及认识排序次序的影响。
指定排序次序
可以在如下的索引和排序操作中为字符型字段指定排序次序。
若要指定排序次序
在“工具”菜单中选择“选项”。
选择“数据”选项卡。
在“排序序列”框中,选择适当的排序次序。
要将此设置用于以后的 Visual FoxPro 操作,选择“设置为默认值”。
提示 也可以使用 SET COLLATE TO 命令或在 Config.fpw 文件中的 COLLATE 语句里指定排序次序。有关 Config.fpw 的详细内容,请参阅《安装指南》中的的第三章“配置 Visual FoxPro”。
当前的排序次序并不影响以前创建的索引。然而,它对比较结果和 SEEK、SELECT - SQL 等命令确有影响。有关详细内容,请参阅本章稍后的“认识排序次序的影响”。
可以在任何时刻更改排序次序。例如,在打开一个 customer 表后,可以创建索引标识来代表不同的排序次序,如下列代码所示。然后,只需使用不同的索引标识就可改变排序次序。
USE customer
SET COLLATE TO "GENERAL"
INDEX ON fname TAG mygeneral ADDITIVE
SET COLLATE TO "MACHINE"
INDEX ON custid TAG mymachine ADDITIVE
SET COLLATE TO "DUTCH"
INDEX ON lname TAG mydutch ADDITIVE
注释 索引的排序次序会覆盖当前的排序次序。
当前的代码页决定了哪种排序次序可供使用。当前的代码页不支持用 SET COLLATE 命令指定的排序次序,Visual FoxPro 会报告出错。另外,如果当前的代码页不支持在 Config.fpw 中指定的排序次序,那么将使用默认值“Machine”。
检查排序次序
可使用 SET ('COLLATE') 函数来确定当前的排序次序。例如,可保存当前的排序次序,将当前的排序次序设置为“Machine”,执行所需的任何工作,然后使用如下代码恢复原有的排序次序:
cCurrentOrder=SET('COLLATE')
SET COLLATE TO 'MACHINE'
*
* 需要 Machine 排序次序的代码
*
SET COLLATE TO cCurrentOrder
&& 返回到前一个排序次序
此外,可使用 IDXCOLLATE( ) 函数来决定索引和索引标识的排序次序。
认识排序次序的影响
排序次序对字符串比较、SEEK 及 SELECT - SQL 等命令的结果有影响,如下所述。
字符串比较
除“Machine”和“Unique Weight”排序次序外,其余排序次序都忽略大小写,这意味着在索引表达式中不一定要使用 UPPER( ) 函数。
当前的排序次序将影响字符串比较的结果。例如,当把排序次序设为“General”时,下面的表达式返回“真”(.T.):
?"A" = "a"
?"Straße"="Strasse"
?"æ"= "ae"
然而,当使用“Machine”排序次序时,所有这些语句返回“假”(.F.)。因为字符串是按照字节进行精确比较的。
字符串比较操作符 (==) 同于按值比较,或使用“Machine”排序次序(即按字节比较)进行的比较。例如,下面的语句返回“假”(.F.):
? "Straße" == "Strasse"
注释 当使用字符串比较操作符 (==) 时,Visual FoxPro 将忽略 SET EXACT 设置。
使用 SEEK
当在执行一个部分查找时,Visual FoxPro 将忽略注音符号。如果表达式长度小于关键字长度则发生部分查找。如果注音符号很重要,则应考虑使用 SCAN FOR ... ENDSCAN 或 LOCATE FOR ... CONTINUE,而不是 SEEK。
使用 SCAN 和 LOCATE 比使用 SEEK 有如下的优点:
SCAN 和 LOCATE 对注音符号敏感。
如果当前的排序次序为“Machine”或“Unique Weight”时,Visual FoxPro 对 SCAN 或 LOCATE 的结果进行全面优化,而对 SEEK 结果仅进行部分优化。
SCAN 和 LOCATE 能记录使用它们所需的条件,允许在条件循环重复时使用它们。相比之下,SEEK 将置于索引中的某个位置,然后 SKIP 从那一点继续搜寻。因此,使用国际化数据,SEEK 可能得不到需要的结果。
使用 SELECT - SQL
SELECT - SQL 命令使用当前的排序次序,如果拥有基于“General”排序次序的索引标识,并且当前的排序次序(由 SET ('COLLATE') 返回)为“Machine”,则 SELECT - SQL 的结果则基于“Machine”。
要使用当前排序次序,请使用 SELECT - SQL的 ORDER BY 子句。
使用索引
排序次序决定了索引表中记录的排序。在使用带排序次序的索引时请考虑如下规则:
如果想使用非“Machine”的排序次序,请重建早期 FoxPro 版本创建的索引。
重建 dBASE 索引,以便利用 Visual FoxPro 排序次序的优点。.
使用 REINDEX 命令来重建索引,因为 REINDEX 不会改变排序次序。
[
本帖最后由 sdta 于 2012-3-2 15:44 编辑 ]