English 中文(简体)
如何匹配 T -SQL 中的 US -ASCII 字符?
原标题:How to match US-ASCII characters in T-SQL?

我想在一个栏目中存储 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;

插入 的第一个行与Itzik用来匹配非数字字符的模式相似。第二行是我的尝试,以适应可打印的US-ASCII 字符范围以外的字符。

当我执行上述批次时,我收到以下结果:

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字符。但这些不匹配。

类似表达式的图案有什么问题?

最佳回答
问题回答

暂无回答




相关问题
Percent Encoded UTF-8 to Ascii(8-bit) conversion

Im reading in urls and they often have percent encoded characters. Example: %C3%A9 is actually é According to http://www.microsystools.com/products/sitemap-generator/faq/character-percentage-url-...

US-ASCII encoding with Odd and Even numbers?

I splitted the list of numbers 1-100 to files of 2 bytes. Then, I noticed that each odd number btw 11-99 needs 2 files, ie 4bytes, while each even number btw 11-99 needs 1 file, 2bytes. A file is ...

Issues with Chr(0) in SQL INSERT script

We currently use the SQL Publishing Wizard to back up our database schemas and data, however we have some database tables with hashed passwords that contain the null character (chr(0)). When SQL ...

Encoding a string to ascii

I have a long string that I want to encode to ascii. I m doing: s = s.encode( ascii , replace ) but I get: ascii codec can t decode byte 0xc3 in position 2646: ordinal not in range(128) (I ve ...

热门标签