我想在一个栏目中存储 URL 。 根据< a href="https://www.rfc- editor.org/rfc/rfc3986#section-2" rel= "nofollow norefererr" >RFC 3986 , US- ASCII 是构建 URL 的字符集 。
SQL SQL 服务器有 VARCHAR 类型, 它可以从 US- ASCII 字符集编码所有字符, 还有128个取决于代码页面的字符 。
我要使用 CHECK 限制来确保列中的值只包含来自 US- ASCII 字符集的可打印字符; 换句话说, 字符串中每个字符的值为 ASCII (@char) & gt; = 32 和 ASCII (@char) & lt; 127
。
我想我可以用类似表达方式来在检查限制下这样做, 但我找不到正确的模式 。 我试图调整 Itzik Ben- Gan 的把戏, 使其与允许范围以外的任何字符匹配, 他在文章< a href=' 中介绍了这一点 http://www.sqlmag.com/ article/tsql3/can-i- convert- thiss- string- to- an- integer- " rel=" nofollow noreferrer" 。 我能将这个字符串转换成整数吗? < / a> 。
在我的测试工具中,我为候选人创建了一个表格TestData
,以便在我的专栏中插入一个表格Patterns
,该表格是用于类似操作员使用的图案图案,然后我选择每种图案与每个候选人匹配的结果:
DECLARE @TestData TABLE (
String VARCHAR(60) COLLATE Latin1_General_CI_AS NOT NULL
);
INSERT INTO @TestData(String)
VALUES
( €ÿ ),
( ab3 ),
( http://www.google.com/ ),
( http://www.example.com/düsseldorf?neighbourhood=Lörick ),
( 1234 );
DECLARE @Patterns TABLE (
Pattern VARCHAR(12) COLLATE Latin1_General_CI_AS NOT NULL
);
INSERT INTO @Patterns (Pattern)
VALUES
( %[^0-9]% ),
( %[^ + CHAR(32) + - + CHAR(126) + ]% );
SELECT
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS ID,
String,
Pattern,
CASE WHEN String NOT LIKE Pattern THEN 1 ELSE 0 END AS [Match]
FROM @TestData CROSS JOIN @Patterns;
插入
当我执行上述批次时,我收到以下结果:
ID String Pattern Match
--- -------------------------------------------------------- ------------ ------
1 €ÿ %[^0-9]% 0
2 ab3 %[^0-9]% 0
3 http://www.google.com/ %[^0-9]% 0
4 http://www.example.com/düsseldorf?neighbourhood=Lörick %[^0-9]% 0
5 1234 %[^0-9]% 1
6 €ÿ %[^ -~]% 0
7 ab3 %[^ -~]% 0
8 http://www.google.com/ %[^ -~]% 0
9 http://www.example.com/düsseldorf?neighbourhood=Lörick %[^ -~]% 0
10 1234 %[^ -~]% 0
如预期的那样,第5行是匹配的,因为候选人只包含数字。第1行第4行的候选人不只包含数字,因此与模式不符。
如预期的那样,第6行的候选人与模式不符,因为它含有高级 ASCII 字符。
我希望第7排、第8排和第10排的候选人能够匹配,因为他们只包含可打印的US-ASCII字符。但这些不匹配。
类似表达式的图案有什么问题?