为什么我可以在varchar列中存储乌克兰字符串?

时间:2015-09-09 07:16:44

标签: sql-server unicode multilingual

我有点惊讶,因为我能够在varchar列中存储乌克兰字符串。

我的表是:

create table delete_collation
(
   text1 varchar(100) collate SQL_Ukrainian_CP1251_CI_AS
)

并使用此查询我能够插入:

insert into delete_collation
values(N'використовується для вирішення квитки')

但是当我删除'N'时,它会在select语句中显示??????

是否可以,或者我在使用整理理解unicode和非unicode时遗漏了什么?

2 个答案:

答案 0 :(得分:4)

来自MSDN

  

使用字母N添加Unicode字符串常量。没有   N前缀,该字符串将转换为默认代码页   数据库。此默认代码页可能无法识别某些字符。

更新:
请看类似的问题::
What is the meaning of the prefix N in T-SQL statements?
Cyrillic symbols in SQL code are not correctly after insert
sql server 2012 express do not understand Russian letters

答案 1 :(得分:4)

扩展MegaTron的答案:

使用collate SQL_Ukrainian_CP1251_CI_AS,SQL Server可以使用CodePage 1251在varchar列中存储乌克兰字符。

但是,当您指定不带N前缀的字符串时,该字符串将在发送到数据库之前转换为默认的非unicode代码页,这就是您看到??????的原因

因此,使用varchar并进行整理是完全正常的,但在向数据库发送字符串时必须始终包含N前缀,以避免中间转换为默认值(非乌克兰语代码页。