8

我有正在处理俄语文本的数据库,但是当我运行查询时,它向我显示了这一点。俄罗斯人将使用数据库,它必须正确显示俄语文本!

在此处输入图像描述

任何想法如何解决它?将来它将位于俄罗斯并与俄语版本的 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');
4

2 回答 2

20

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

确保该列具有正确的排序规则,它被定义为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'Иванов');

结果:

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

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

于 2013-08-20T01:43:04.853 回答
1

虽然 Aaron Bertrand 很好地解释了为什么你会得到这样的结果,但我想说有一种方法可以不给你所有的字符串加上俄语字母前缀'N'
据我所知,您刚刚正确设置了服务器排序规则。因此,如果您设置排序规则,例如 like Cyrillic_General_CI_AS,服务器可以正确处理带有俄语字母的 varchar:

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

结果:

espanol ?????   иван    Cyrillic_General_CI_AS

如您所见,西班牙语和中文字符串没有得到正确处理,而俄语字符串则处理得当。因此,您可以将数据插入到 nvarchar 列中,而无需在字符串前面加上'N'

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

虽然拥有正确的默认排序规则可能很方便,但此解决方案存在问题 -在已安装的 SQL Server 上更改默认排序规则并不容易,因此在安装 SQL Server 实例时必须小心并正确选择排序规则。

于 2013-08-20T05:41:04.153 回答