这是一个纯粹的理论问题,以包围我的脑袋
假设我有Unicode
旋风(1F300
)符号。如果我尝试将其存储在具有默认varchar
归类的Latin1_General_CI_AS
列中,则旋风符号不能适合varchar
中每个符号使用的一个字节...
我可以看到这样做的方式:
我在插入几个不同的unicode符号后做了一些研究
INSERT INTO [Table] (Field1)
VALUES ('')
INSERT INTO [Table] (Field1)
VALUES ('')
然后在我得到SELECT
cast (field1 as varbinary(10))
的两种情况下将它们作为字节0x3F3F
读取。
3F
中的{p> ascii
为?
(question mark),例如我在正常??
时看到的两个问号(select *
)这是否意味着数据是吐司而不是第一口被存储?
如何将非整理的Unicode数据存储在varchar列中?
答案 0 :(得分:4)
数据是吐司,正是你看到的,2 x 0x3F字节。这在插入之前的类型转换期间发生,并且实际上与cast('' as varbinary(2))
相同,也是0xF3F3(与转换N''
相反)。
当必须将Unicode数据插入非Unicode列时,通过使用WideCharToMultiByte API和与排序规则关联的代码页,从Unicode内部转换列。如果某个字符无法在给定的代码页上显示,则该字符将替换为问号(?)Ref。
答案 1 :(得分:1)
是的,数据已经消失。
与Varchar相比,NVarchar所需空间更少。但这种减少需要付出代价。 Varchar没有空间来存储Unicode字符(每个字符1个字节,内部查找不够大)。
来自Microsoft's Developer Network:
...考虑使用Unicode nchar或nvarchar数据类型来最小化字符转换问题。
正如您所发现的那样,不受支持的字符会被问号重新标记。