我正在使用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字段。
答案 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
列。
如果Collation列是SQL Server排序规则(即以TEXT
开头的排序,例如VARCHAR
),那么您可以获得索引扫描,但不能获得搜索。
但是,如果Collation列是Windows排序规则(即不以NVARCHAR
开头的排序,例如VARCHAR
),那么您可以获得索引搜索。
以下测试显示了此行为:
SQL_