Классический ASP, SQL Server и кодировки символов - PullRequest
2 голосов
/ 07 октября 2009

У меня есть классическая ASP-страница, на которую помещается POST. Данные отправляются как 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 ]

3 голосов
/ 08 октября 2009

Если вы переключитесь на использование NVARCHAR, тогда вам нужно будет не забывать использовать спецификатор N в своих командах SQL, например, всякий раз, когда вы используете строку, которая является Unicode

INSERT INTO SOME_TABLE (someField) VALUES (N'Some Unicode Text')

SELECT * FROM SOME_TABLE WHERE someField=N'Some Unicode Text'

Если вы не сделаете этого, строки не будут обрабатываться как Unicode, и ваши данные будут автоматически преобразованы в Latin1 или любой другой набор символов по умолчанию для соответствующей базы данных / таблицы / поля , даже если это поле является NVARCHAR

2 голосов
/ 08 октября 2009

Вы правы.

VBScript и ADODB знают только строки как Unicode (или UTF-16, как его иногда называют).

Это часть параметров сортировки БД, которые определяют, как кодируются поля VARCHAR.

В SQL_Latin1_General_CP1_CI_AS это действительно CP1 бит, который определяет CodePage для использования. В этом случае 1 является устаревшей ссылкой на Windows-1252, которая является надмножеством ISO-8859-1.

...