sql server 2012快递不懂俄文字母

时间:2013-08-20 01:38:44

标签: sql sql-server

我有使用俄语文本的数据库,但是当我运行查询时,它会向我显示此信息。数据库将由俄罗斯人使用,它必须正确显示俄语文本!

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');

2 个答案:

答案 0 :(得分:17)

您确定数据是否已正确存储在数据库中?你怎么知道的?

确保列具有正确的排序规则,将其定义为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ЗИІКЛ

为了说明这会如何影响您的insert语句,您的字符串缺少N前缀:

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

结果:

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

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

答案 1 :(得分: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实例并正确选择排序规则时必须小心。