Samool's blog

Delphi POS函数中文处理的问题

作者:傻猫 发布时间:2010-03-01 13:45:33 分类:Delphi 3 Comments 43 Views

delphi漏洞 pos()函数的奇怪现象

edit1.Text := intToStr(pos('市',资中市'));
结果=5,正确.

edit1.Text := intToStr(pos('市','资兴市'));
结果=2 . -_-?

edit1.Text := intToStr(pos('市','湖南省郴州市资兴市'));
结果=11,正确.

edit1.Text := intToStr(pos('市','湖南省资兴市郴州市'));
结果=8 . -_-?

以上结果都进行调试过,有没高手知道为什么会这样的?

---------------------------------------------

因为“资”的后半部分加上“兴”的前半部分就是“市”。
s1:='资';
s2:='兴';
ShowMessage(s1[2]+s2[1]);

不是漏洞,是由于汉字由两个字节组成的,使用WideString就Ok了
试试看:
edit1.Text := intToStr(pos('市',WideString('资中市')));
//结果=3,正确.

edit1.Text := intToStr(pos('市',WideString('资兴市')));
//结果=3

CHARINDEX 和 POS

作者:傻猫 发布时间:2009-02-04 13:00:21 分类:Delphi No Comments 5 Views

今天在要存储过程中实现字符判断功能,想找一个跟POS类似的函数,搜索后发现SQL里其实也有类似POS的函数CHARINDEX ,解释如下:

expression2 要搜索的字符表达式。
start_location 表示搜索起始位置的整数或 bigint 表达式。如果未指定 start_location,或者 start_location 为负数或 0,则将从 expression2 的开头开始搜索。

如果 expression1expression2 之一是 Unicode 数据类型(nvarcharnchar)而另一个不是,则将另一个转换为 Unicode 数据类型。CHARINDEX 不能与 textntextimage 数据类型一起使用。

如果 expression1expression2 之一为 NULL,并且数据库兼容级别为 70 或更高,则 CHARINDEX 将返回 NULL。如果数据库兼容级别为 65 或更低,则 CHARINDEX 将仅在 expression1expression2 都为 NULL 时才返回 NULL 值。

如果在 expression2 内找不到 expression1,则 CHARINDEX 返回 0。

CHARINDEX 将根据输入的排序规则执行比较操作。若要以指定排序规则进行比较,则可以使用 COLLATE 将显式排序规则应用于输入值。

返回的开始位置从 1 开始,而非从 0 开始。

以下示例返回字符序列 bicycleDocument 表的 DocumentSummary 列中开始的位置。

DECLARE @document varchar(64)

SELECT @document = 'Reflectors are vital safety' +
                   ' components of your bicycle.'
SELECT CHARINDEX('bicycle', @document)
GO

下面是结果集:

-----------
48         

以下示例将使用可选的 start_location 参数从 DocumentSummary 列的第五个字符开始查找 vital

DECLARE @document varchar(64)

SELECT @document = 'Reflectors are vital safety' +
                   ' components of your bicycle.'
SELECT CHARINDEX('vital', @document, 5)
GO

下面是结果集:

-----------
16         

(1 row(s) affected)

以下示例显示了在 expression2 内找不到 expression1 时的结果集。

DECLARE @document varchar(64)

SELECT @document = 'Reflectors are vital safety' +
                   ' components of your bicycle.'
SELECT CHARINDEX('bike', @document)
GO

下面是结果集:

-----------
0         

(1 row(s) affected)

下面的示例在 'Das jst ein Test' 中执行区分大小写的字符串 'TEST' 搜索。

USE tempdb;
GO
--perform a case sensitive search
SELECT CHARINDEX ( 'TEST',
       'Das ist ein Test'
       COLLATE Latin1_General_CS_AS)

下面是结果集:

-----------
0         

下面的示例在 'Das jst ein Test' 中执行区分大小写的字符串 'Test' 搜索。

USE tempdb;
GO
SELECT CHARINDEX ( 'Test',
       'Das ist ein Test'
       COLLATE Latin1_General_CS_AS)

下面是结果集:

-----------
13         

下面的示例在 'Das jst ein Test' 中执行不区分大小写的字符串 'TEST' 搜索。

USE tempdb;
GO
SELECT CHARINDEX ( 'Test',
       'Das ist ein Test'
       COLLATE Latin1_General_CI_AS)
GO

下面是结果集:

-----------
13