Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Проблемы с кодировкой ADO.NET

#c_sharp #sql #net #sql_server #adonet


Создал таблицу в БД, но при добавлении символов кириллицы, символ '?', знаю что это
проблемы с кодировкой, но как установить UTF-8 в БД?


public static void Add_User(string login, string password, string firstName, string
secondName, string secretQuestion, string responseQuestion, DateTime birthDay)
{
    string sqlExpression = "INSERT INTO Users (Login, Password, FirstName, SecondName,
Birthday, SecretQuestion, ResponseQuestion) " +
        string.Format("VALUES (" + @"'{0}', '{1}', '{2}', '{3}', {4}, '{5}', '{6}'"
+ ")", login, password, firstName, secondName, birthDay.ToString("u").Replace(" 00:00:00Z",
""), secretQuestion, responseQuestion);
    SqlCommand comAdd = new SqlCommand(sqlExpression, _dbConnection);
    comAdd.ExecuteNonQuery();
}

    


Ответы

Ответ 1



Если вам нужен именно Unicode, то встроенной поддержки для хранения Unicode-ных строк в кодировке UTF-8 в SqlServer нет, поддерживается только кодировка UTF-16. Для хранения Unicode-ных строк существуют типы данных nchar и nvarchar. Соответственно нужные столбцы в таблице должны иметь соответствующий тип. Например: create table Users ( FirstName nvarchar(20), LastName nvarchar(30) ); Если с типами всё в порядке, но, к примеру, такая insert into Users (FirstName, LastName) values ('Имя', 'Фамилия'); вставка создаёт запись с ???, то скорее всего collation базы данных отличается от кириллического (проверить collation заданный для БД можно выполнив скрипт select collation_name from sys.databases where database_id = db_id()). В этом случае перед строковым литералом, содержащим нелатинские символы, добавьте N, чтобы SqlServer воспринимал его как Unicode. Т.е., например, N'Имя' вместо 'Имя': insert into Users (FirstName, LastName) values (N'Имя', N'Фамилия'); Вообще для nvarchar литералов с нелатинскими символами я бы посоветовал добавлять N всегда, чтобы не зависеть от collation базы. Что касается кода вашего метода Add_User, то он уязвим для sql-injection атаки. Вместо формирования строки с литералами безопаснее использовать параметризованный запрос.

Ответ 2



В SQL Server нет поддержки UTF-8, но есть UTF-16. Подробнее тут. Установить кодировку в базе данных можно так. ALTER DATABASE DBNAME COLLATE SQL_Latin1_General_CP1_CI_AS или для cyrillic ALTER DATABASE DBNAME COLLATE Cyrillic_General_CI_AS Проверить кодировку в базе данных можно так SELECT SERVERPROPERTY('Collation') См. MSDN "Поддержка параметров сортировки и Юникода"

Комментариев нет:

Отправить комментарий