sql server 2012 express不懂俄语字母
我有一个数据库,它正在处理俄语文本,但是当我运行查询时,它显示了这一点。数据库将由俄罗斯人使用,它必须正确显示俄文文本 有没有办法解决这个问题?在未来,它将位于俄罗斯,并与俄罗斯版本的SQL Server一起工作,但现在我正在开发英语版本的SQL 2012 Express 以下是表格和insert语句:sql server 2012 express不懂俄语字母,sql,sql-server,Sql,Sql Server,我有一个数据库,它正在处理俄语文本,但是当我运行查询时,它显示了这一点。数据库将由俄罗斯人使用,它必须正确显示俄文文本 有没有办法解决这个问题?在未来,它将位于俄罗斯,并与俄罗斯版本的SQL Server一起工作,但现在我正在开发英语版本的SQL 2012 Express 以下是表格和insert语句: Create table Employee ( EmpID int not null IDENTITY (10, 1), StrName nvarchar (25) not null,
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');
您确定数据已正确存储在数据库中吗?你怎么知道的 确保列具有正确的排序规则,它被定义为
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'Иванов');
结果:
ID bar
---- --------------
1 ????????Z?????
2 АБВГДЕЖЅZЗИІКЛ
------ ------
?????? Иванов
因此,请在Unicode字符串前面加上前缀“
N'a prefix”
,否则会丢失数据。虽然Aaron Bertrand很好地解释了为什么会得到这样的结果,但我认为有一种方法可以避免在所有字符串前面加上俄语字母'N'
据我所知,您刚刚正确设置了服务器排序规则。所以,如果您设置排序规则,例如,像
Cyrillic\u General\u CI\u AS
,服务器可以正确地使用俄语字母处理varchar:
select
'español', '平成年月日', 'иван',
serverproperty('collation')
结果:
espanol ????? иван Cyrillic_General_CI_AS
正如您所看到的,西班牙语和汉语字符串处理不当,而俄语字符串处理不当。因此,您可以将数据插入nvarchar列,而无需在字符串前面加上前缀'N'
也就是说,我使用数据库中的nvarchar数据类型作为默认字符串,存储过程中的nvarchar参数。我很少在代码中使用俄语字符串(仅当我想测试某些东西时),而且我从未使用过N'string'
语法
虽然拥有正确的默认排序规则可能很方便,但此解决方案存在问题—不容易实现,因此在安装SQL Server实例时必须小心,并正确选择排序规则。是您的列
varchar
还是nvarchar
?Thanx!看起来它正在工作,所以在向每个字段插入任何文本之前,每次都必须使用N
?在向Unicode(nchar/nvarchar)列中插入任何文本以及字符串文字可能包含基本ASCII字符集之外的字符时,都需要使用它。因此,从本质上说:是的。虽然在这种情况下这会让你变得懒惰,但问题是(并可能导致其他问题),而且不在Unicode字符串前面加前缀的习惯也可能导致其他地方的问题-你并不总是有改变服务器排序规则的神奇能力。@AaronBertrand是的,更改服务器排序规则确实是一件痛苦的事情,但此信息可能对OPI有用。我认为您的回答不应意味着更改服务器排序规则比向字符串添加前缀N更容易,而不管服务器排序规则如何,字符串的前缀都应为N。或者可能包括更改服务器排序规则(以及gotchas)的所有步骤。现在听起来这更容易,但事实并非如此。