我在 MSSQL 中有一个 nvarchar(50) 列,我在其中输入用户密码。我知道例如一些特殊字符(如 $ %)是允许的,但我在哪里可以查看允许使用哪些列表字符?
答案1
nchar/nvarchar是 SQL Server 的固定和灵活长度 UNICODE UCS-2 字符集数据类型。
那么问题来了,UCS-2 到底是什么?维基百科,它将允许 1.1M 个代码点。
以下内容是从维基文章中复制而来的,因为我是一个愚蠢的美国人,我无法理解这一切意味着什么。
代码点 U+0000 至 U+D7FF 以及 U+E000 至 U+FFFF
第一个平面(代码点 U+0000 至 U+FFFF)包含最常用的字符,称为基本多文种平面或 BMP。UTF-16 和 UCS-2 都将此范围内的代码点编码为单个 16 位代码单元,这些代码单元在数值上等于相应的代码点。BMP 中的代码点是唯一可以用 UCS-2 表示的代码点。在此平面内,代码点 U+D800 到 U+DFFF(见下文)保留用于前导和尾随代理。
代码点 U+10000 至 U+10FFFF
其他平面(称为补充平面)的代码点通过称为代理对的 16 位代码单元对以 UTF-16 进行编码,具体方案如下:
- 从代码点中减去 0x010000,剩下 0..0x0FFFFF 范围内的 20 位数字。
- 将前十位(0..0x03FF 范围内的数字)添加到 0xD800 以提供第一个代码单元或主要代理,其范围为 0xD800..0xDBFF。(Unicode 标准的先前版本将这些称为高代理。)
- 将低十位(也在 0..0x03FF 范围内)添加到 0xDC00 以提供第二个代码单元或尾代理,其范围为 0xDC00..0xDFFF。(Unicode 标准的先前版本将这些称为低代理。)
由于首字符代理、尾字符代理和有效 BMP 字符的范围是不相交的,因此搜索变得简单:一个字符的一部分不可能与另一个字符的不同部分匹配。这也意味着 UTF-16 在 16 位字上是自同步的:无需检查前面的代码单元就可以确定代码单元是否开始一个字符。UTF-8 具有这些优点,但许多早期的多字节编码方案不允许进行无歧义搜索,只能通过从字符串开头重新解析来实现同步。如果一个字节丢失或遍历从随机字节开始,UTF-16 就不是自同步的。
由于最常用的字符都在基本多语言平面中,因此代理对的处理通常没有经过彻底测试。这导致持续存在的错误和潜在的安全漏洞,即使在流行且经过良好审查的应用软件中也是如此(例如 CVE-2008-2938、CVE-2012-2135)
答案2
NVARCHAR 可以包含 Unicode 字符。 http://msdn.microsoft.com/en-us/library/ms186939.aspx
Unicode 字符串常量以字母 N 为前缀。如果没有 N 前缀,则字符串将转换为数据库的默认代码页。此默认代码页可能无法识别某些字符。
DECLARE @nv NVARCHAR(20)
SET @nv = N'Minyā'
SELECT @nv
以下是 Unicode 字符的列表: http://en.wikipedia.org/wiki/List_of_Unicode_characters