我有一列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'
?
答案 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
,将其按字节拆分,然后转换为int
和char
。