经典的ASP,SQL Server和字符编码

时间:2009-10-07 15:37:05

标签: asp-classic character-encoding ado

我有一个经典的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)吗?

2 个答案:

答案 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}}的超集。