我有一个经典的ASP页面,可以发布到。数据以UTF-8的形式发布(我可以在Fiddler中看到这一点)。然后,我打开到数据库的ADODB连接,并将数据存储在VARCHAR字段中。如果数据可以由8859-1表示(例如iñtërnâtiônàlizætiøn),则它将正确存储在varchar字段中。如果我尝试无法映射到8859的字符串(例如Здравствуйте!),我会得到????????????这一切都有意义,因为varchar字段不能保存unicode。我也明白使用nvarchar字段应该可以让我存储utf-8字符串。
我的问题是这个。 SQL Server或ADODB对象中的哪些设置控制字符串从UTF-8转换为8859-1的方式? VBScript(ASP)将字符串发送到ADODB.Connection.Execute为UTF-8(或者我认为它实际上在做什么 - UTF-16)并且数据库本身处理转换?这是由数据库的排序规则控制的(在这种情况下是SQL_Latin1_General_CP1_CI_AS)吗?
答案 0 :(得分:3)
如果切换到使用NVARCHAR,那么每当使用Unicode字符串时,您都需要记住在SQL命令中使用N说明符
INSERT INTO SOME_TABLE (someField) VALUES (N'Some Unicode Text')
SELECT * FROM SOME_TABLE WHERE someField=N'Some Unicode Text'
如果你不这样做,那么字符串将不会被视为Unicode,你的数据将被静默转换为Latin1或相关数据库/表/字段的默认字符集,即使该字段是NVARCHAR
答案 1 :(得分:2)
你是对的。
VBScript和ADODB只知道字符串为Unicode(或者有时提到的UTF-16)。
它是DBs排序规则设置的一部分,用于确定VARCHAR字段的编码方式。
在SQL_Latin1_General_CP1_CI_AS
中确实是CP1
位确定要使用的CodePage
。在这种情况下,1
是对Windows-1252
的遗留引用,ISO-8859-1
是{{1}}的超集。