| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2171 人关注过本帖, 1 人收藏
标题:在vfp中,distinct和group最多可以区分多长的字符串
取消只看楼主 加入收藏
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
结帖率:88.24%
收藏(1)
已结贴  问题点数:20 回复次数:10 
在vfp中,distinct和group最多可以区分多长的字符串
在vfp中,用distinct对数据去除重复时候或者用group对数据进行分组时候发现这样的现象:如果字符串太长(例如140字节),就会把仅仅前面部分相同的字符串认为是相同的字符串。不知道是不是vfp区分不同字符串的能力有限?如果有限制,那么限制是多少?
这种情况可以把比较长的字符串拆分成两个进行比较,但是这样会使编程变得繁琐很多,不知道有没有什么好的方法来处理这个问题?
数据表只有一个字段,选出了4条记录如下:
1、y20$365y10$380y10$40y10y20$365y10$380y10$40y10y20$365y10$380y10$40y10$501y15$527y10$548y15$567y20$574y20$576y10$587y10$64y10$
2、y20$365y10$380y10$40y10y20$365y10$380y10$40y10y20$365y10$380y10$40y10$501y15$527y10$548y15$567y20$574y20$576y10$587y10$64y10$87y10$92y10$93y
3、y20$365y10$380y10$40y10y20$365y10$380y10$40y1010$250y10$252y10$271y15$301y20$317y20$365y20$374y20$393y10$453y15$501y10$521y10$68y10$
4、y20$365y10$380y10$40y10y20$365y10$380y10$40y1010$250y10$252y10$271y15$301y20$317y20$365y20$374y20$393y10$453y15$501y10$521y10$68y10$68y10$8
这4条记录本来是都不重复的,但是去除重复后只剩余两条记录:VFP6.0、VFP9.0下,group by时,只有第2、第4条记录存在

INDEX ON 字段名 TO CFIELD UNIQUE
显示的记录为第1、第3条记录
反复试验均是如此,搞不清楚怎么回事,但是去除前面部分相同内容就没有问题了,所以怀疑是字符串长度问题,请高手给予指点!多谢!
搜索更多相关主题的帖子: 能力 数据表 字符串 编程 vfp 
2012-02-18 23:21
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用软件服务在2012-2-18 23:49:37的发言:

128
有根据吗

坚守VFP最后的阵地
2012-02-19 00:09
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用qingfameng在2012-2-19 19:05:51的发言:

sdta 楼主:真不行的话还是需要拆分。临时拆分。只把长字段 用 select 处理一次即可。总比结果不可靠要好。(仅供参考)。
我现在是想查找一下原因,到底是什么原因,产生了这种情况,如果没有稳妥的解决方法,谁知道那天还会发生这种情况

坚守VFP最后的阵地
2012-02-19 19:14
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用TonyDeng在2012-2-21 00:56:19的发言:

你在SQL Server中驗證過沒有?有沒有同樣現象?
没,VFP6-9验证过,与索引有关吗
多谢了,多费心。

坚守VFP最后的阵地
2012-02-21 01:08
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 11楼 软件服务
我现在是想查找一下原因,到底是什么原因,产生了这种情况,如果没有稳妥的解决方法,谁知道那天还会发生这种情况

坚守VFP最后的阵地
2012-02-21 12:41
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用软件服务在2012-2-21 16:18:01的发言:

你当索引是表用啊
有话就说,有P就F,别吞吞吐吐

[ 本帖最后由 sdta 于 2012-2-21 18:51 编辑 ]

坚守VFP最后的阵地
2012-02-21 16:21
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用TonyDeng在2012-2-21 01:26:52的发言:

你不是下載了一個SQL命令手冊的嗎,看看嘛。
上面没提到这方面的问题。

坚守VFP最后的阵地
2012-02-23 12:01
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
问题没解决,为何结贴了。

坚守VFP最后的阵地
2012-03-01 19:55
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用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 编辑 ]

坚守VFP最后的阵地
2012-03-02 15:42
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
最后得出的结论:SET COLLATE TO 设置为
SET COLLATE TO 'MACHINE'
不能用
SET COLLATE TO 'PINYIN'

坚守VFP最后的阵地
2012-03-02 15:46
快速回复:在vfp中,distinct和group最多可以区分多长的字符串
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018613 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved