2013-08-20 43 views
7

我有DB与俄罗斯文本工作,但是当我运行查询它显示了我这一点。数据库将被俄罗斯人使用,它必须正确显示俄文文本!SQL服务器2012年快递不明白俄文字母

enter image description here

任何想法如何解决呢?未来它将位于俄罗斯并与俄文版SQL Server一起工作,但现在我正在使用英文版SQL 2012 Express。

下面是表和插入语句:

Create table Employee 
(
EmpID int not null IDENTITY (10, 1), 
StrName nvarchar (25) not null, 
Phone1 nvarchar (25) not null, 
Phone2 nvarchar (25) 
Primary Key (EmpID), 
); 
insert into Employee (LastName , FirstName,Phone1,Phone2) 
    values ('Иванов','111 111 11111','111 111 1111'); 
+0

是你的列'varchar'还是'nvarchar'? – Gabe

回答

16

确定的数据已被存储在正确的数据库?你怎么知道的?

确保该列具有适当的归类,并将其定义为nvarchar,并且字符串文本的插入前缀为N。例如,这些是不一样的:

INSERT dbo.table(column) SELECT 'foo'; 
INSERT dbo.table(column) SELECT N'foo'; 

举个例子:

USE tempdb; 
GO 

CREATE TABLE dbo.foo 
(
    ID INT PRIMARY KEY, 
    bar NVARCHAR(32) COLLATE SQL_Ukrainian_CP1251_CI_AS 
); 

INSERT dbo.foo SELECT 1,'АБВГДЕЖЅZЗИІКЛ'; 
INSERT dbo.foo SELECT 2,N'АБВГДЕЖЅZЗИІКЛ'; 

SELECT ID, bar FROM dbo.foo; 
GO 
DROP TABLE dbo.foo; 

结果:

ID bar 
---- -------------- 
1  ????????Z????? 
2  АБВГДЕЖЅZЗИІКЛ 

并展示如何影响你的插入语句,你的字符串是失踪N前缀:

SELECT 
    CONVERT(NVARCHAR(32), 'Иванов'), 
    CONVERT(NVARCHAR(32), N'Иванов'); 

结果:

------ ------ 
?????? Иванов 

因此,前缀N'a prefix'或丢失数据的Unicode字符串。

+0

Thanx!看起来像在工作,所以在每个字段中插入任​​何文本之前,我必须每次使用'N'吗? – Andrey

+1

对于任何插入到Unicode(nchar/nvarchar)的列中以及当字符串文字可能包含基本ASCII字符集之外的字符时,您都需要它。所以,本质上:是的。 –

2

虽然Aaron Bertrand给出了一个很好的解释,为什么你会得到这样的结果,我会说有一种方法,不要在你所有的字符串前加上俄文字母'N'
据我所知,你刚刚设置好你的服务器排序规则。所以,如果你设置你的归类,比如说像Cyrillic_General_CI_AS,服务器可以治疗VARCHAR用俄文字母正确:

select 
    'español', '平成年月日', 'иван', 
    serverproperty('collation') 

结果:

espanol ????? иван Cyrillic_General_CI_AS 

正如你看到的,西班牙语和日语字符串不妥善处理而俄罗斯的字符串是。所以你可以插入数据到nvarchar列而不用在字符串前加上'N'

这就是说,我在我们的数据库中使用nvarchar数据类型作为默认字符串,存储过程中的nvarchar参数。我很少在代码中使用俄语字符串(仅当我想测试某些内容时),并且我从未使用过N'string'语法。

虽然有正确的默认排序规则可能会很方便,但这种解决方案存在问题 - 这对于change default collation on installed SQL Server并不容易,所以在安装SQL Server实例并正确选择排序规则时必须小心。

+0

虽然这可以让你在这种情况下懒惰,问题是[更改服务器排序规则是一个痛苦](和http://technet.microsoft.com/en-us/library/ms179254.aspx)导致其他问题),并且不为Unicode字符串添加前缀的习惯也会导致其他地方出现问题 - 您并不总是具有改变服务器排序规则的神奇功能。 –

+0

@AaronBertrand是的,更改服务器排序规则确实很痛苦,但是这些信息可能对OP –

+0

有用我认为您的答案不应该暗示更改服务器排序规则比添加N前缀对应加前缀N的字符串要简单服务器整理。或者可能包括更改服务器排序规则(以及陷阱)的所有步骤。现在听起来这样更容易,事实并非如此。 –