用于varchar字段的SQL Server nvarchar N前缀

时间:2011-10-09 11:32:19

标签: sql-server sql-server-2008 sql-server-2005 unicode utf-8

我正在使用SQL Server 2005/2008 Express数据库。对于varchar字段使用N字符串前缀(用于nvarchar字段)是否有任何问题?

e.g。如果我有一个数据库字段:

CREATE TABLE [dbo].[posts](
    post_title varchar(30)
)

然后我只插入ascii数据,但带有N前缀:

INSERT INTO [dbo].[posts] ([post_title]) VALUES (N'My Title');

问题出现是因为我想从PHP应用程序中保存UTF-8字符,而我目前无法区分它所保存的字段是varchar还是nvarchar。所以我只想假设所有都是nvarchar,因为我只会尝试将ASCII字符保存到varchar字段。

2 个答案:

答案 0 :(得分:2)

如果将带有N前缀的字符串写入varchar字段,它将被隐式转换。没有其他开销,你可以安全地假设“一切都是nvarchar”

由于数据类型优先,将nvarchar变量与varchar列进行比较可能会出现问题。将转换varchar列,并且不会使用任何索引。

答案 1 :(得分:2)

接受的答案具有误导性,但这部分是由于问题本身含糊不清(尽管可能不是故意的)。

是的,当存储到{{1 }} / N / XML(不要使用这个!)字段。 但是,这在很多情况下可能是一个相当重要的区别,只有U + 0000到U + 007F范围内的Unicode代码点(即ASCII值0 - 127)才能保证正确转换。 U + 0080(即ASCII值128)的所有内容都可以转换,也可以不转换,具体取决于插入字段的排序规则所隐含的代码页。如果该排序规则的代码页没有该标志的映射,那么您将获得N

要找出代码页的确切内容,首先通过以下两个查询之一找到字段的排序规则:

CHAR

然后您可以使用以下命令从排序规则中找到代码页

VARCHAR

然后,您可以根据该代码页编号在多个站点中找到一个图表,该图表将显示已映射的内容。

排序不是每行,它们是每个字段。因此,无论字段的排序规则如何,都会确定非Unicode字段的字符集(即TEXT / ? / SELECT * FROM sys.columns WHERE [object_id] = OBJECT_ID(N'table_name'); -- OR: EXEC sp_help N'table_name'; )。

所以问题是:什么是术语" ASCII"问题中?它在技术上仅指7位值(前128位;值0-127),但人们经常使用它来表示可以装入单个字节的任何内容,其中还包括扩展ASCII值(第二个128;值128 - 255)这取决于代码页。

关于SELECT COLLATIONPROPERTY('collation_name', 'CodePage'); 列到CHAR变量和文字的潜在问题:索引不会被忽略,但会产生一些负面影响,并且根据整理的排序而有所不同VARCHAR列。

如果Collat​​ion列是SQL Server排序规则(即以TEXT开头的排序,例如VARCHAR),那么您可以获得索引扫描,但不能获得搜索。

但是,如果Collat​​ion列是Windows排序规则(即不以NVARCHAR开头的排序,例如VARCHAR),那么您可以获得索引搜索。

以下测试显示了此行为:

SQL_