我有使用俄语文本的数据库,但是当我运行查询时,它会向我显示此信息。数据库将由俄罗斯人使用,它必须正确显示俄语文本!
任何想法如何解决?将来它将位于俄罗斯并使用俄语版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 :(得分: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实例并正确选择排序规则时必须小心。