作者:傻猫
发布时间: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
作者:傻猫
发布时间:2009-02-04 13:00:21
分类:Delphi
No Comments
5 Views
今天在要存储过程中实现字符判断功能,想找一个跟POS类似的函数,搜索后发现SQL里其实也有类似POS的函数CHARINDEX ,解释如下:

语法 CHARINDEX ( expression1 ,expression2 [ , start_location ] )

参数
expression1 包含要查找的序列的字符表达式。
expression1最大长度限制为 8000 个字符。
- expression2 要搜索的字符表达式。
- start_location 表示搜索起始位置的整数或 bigint 表达式。如果未指定 start_location,或者 start_location 为负数或 0,则将从 expression2 的开头开始搜索。
返回类型 如果expression2的数据类型为 varchar(max)、nvarchar(max) 或 varbinary(max),则为 bigint,否则为 int。

备注
如果 expression1 或 expression2 之一是 Unicode 数据类型(nvarchar 或 nchar)而另一个不是,则将另一个转换为 Unicode 数据类型。CHARINDEX 不能与 text、ntext 和 image 数据类型一起使用。
如果 expression1 或 expression2 之一为 NULL,并且数据库兼容级别为 70 或更高,则 CHARINDEX 将返回 NULL。如果数据库兼容级别为 65 或更低,则 CHARINDEX 将仅在 expression1 和 expression2 都为 NULL 时才返回 NULL 值。
如果在 expression2 内找不到 expression1,则 CHARINDEX 返回 0。
CHARINDEX 将根据输入的排序规则执行比较操作。若要以指定排序规则进行比较,则可以使用 COLLATE 将显式排序规则应用于输入值。
返回的开始位置从 1 开始,而非从 0 开始。

示例
以下示例返回字符序列 bicycle 在 Document 表的 DocumentSummary 列中开始的位置。
DECLARE @document varchar(64)
SELECT @document = 'Reflectors are vital safety' +
' components of your bicycle.'
SELECT CHARINDEX('bicycle', @document)
GO
下面是结果集:
以下示例将使用可选的 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)
下面是结果集:
下面的示例在 'Das jst ein Test' 中执行区分大小写的字符串 'Test' 搜索。
USE tempdb;
GO
SELECT CHARINDEX ( 'Test',
'Das ist ein Test'
COLLATE Latin1_General_CS_AS)
下面是结果集:
下面的示例在 'Das jst ein Test' 中执行不区分大小写的字符串 'TEST' 搜索。
USE tempdb;
GO
SELECT CHARINDEX ( 'Test',
'Das ist ein Test'
COLLATE Latin1_General_CI_AS)
GO
下面是结果集: