SQL Server如何在char中实际存储俄语符号?

时间:2018-07-20 07:09:33

标签: sql-server encoding

我有一列NAME,即CHAR(50)

它包含值'Рулон комбинированный СТЕРИТ 50мм ? 200 м' 哪个整数表示是:

'1056,1091,1083,1086,1085,32,1082,1086,1084,1073,1080,1085,1080,1088,1086,1074,1072,1085,1085,1099,1081,32,1057,1058,1045,1056,1048,1058,32,53,48,1084,1084,32,63,32,50,48,48,32,1084'

但是CHAR表示它包含8位。 SQL Server如何存储像'1056,1091,1083,1086,1085'这样的UNICODE符号值?

好,?符号实际上也是×(215)(乘法符号)

如果SQL Server可以表示'1056',为什么它不能表示'215'

2 个答案:

答案 0 :(得分:1)

char中的255个值由数据库collation确定。对于俄罗斯,通常为Cyrillic_General_CI_AS(CI表示不区分大小写,AS表示不区分重音。)

这很有可能与Windows code page 1251相匹配,因此л存储为十六进制EB或十进制235。您可以使用T-SQL进行验证:

create database d1 collate Cyrillic_General_CI_AS;
use d1
select ascii('л')
-->
235

在西里尔字母代码页中,十进制215表示Ч,而不是乘法符号。由于SQL Server无法将乘法符号与西里尔代码页匹配,因此它用问号代替:

select ascii('×'), ascii('?')
-->
63      63

在西里尔字母代码页中,char 8位表示乘号和问号均为十进制63,即问号。

答案 1 :(得分:0)

  

我有一个名称列,即CHAR(50)。

     

它包含值'РулонкомбинированныйСТЕРИТ50мм? 200м'   哪个整数表示是:

'1056,1091,1083,1086,1085,32,1082,1086,1084,1073,1080,1085,1080,1088,1086,1074,1072,1085,1085,1099,1081,32,1057,1058,1045,1056,1048,1058,32,53,48,1084,1084,32,63,32,50,48,48,32,1084'

上面引用的是错误的。

我使用西里尔排序规则在数据库中进行测试,并且整数表示形式与您显示的内容不同,因此,或者您的数据类型不是char,或者您的整数表示形式是错误的,是的,“但是CHAR表示它包含8位”是正确的,这是您如何证明自己的方法:

--create table dbo.t (name char(50));
--insert into dbo.t values ('Рулон комбинированный СТЕРИТ 50мм ? 200 м')

select cast (name as binary(50))
from dbo.t;

select substring(cast (name as binary(50)), n, 1) as bin_substr,
       cast(substring(cast (name as binary(50)), n, 1) as int) as int_, 
       char(substring(cast (name as binary(50)), n, 1)) as cyr_char
from dbo.t cross join nums.dbo.nums; 

这里dbo.Nums是包含整数的辅助表。我只是将您的字符串从char字段转换为binary,将其按字节拆分,然后转换为intchar

enter image description here