Страницы

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

вторник, 13 ноября 2018 г.

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

Создал таблицу в БД, но при добавлении символов кириллицы, символ '?', знаю что это проблемы с кодировкой, но как установить 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(); }


Ответ

Если вам нужен именно 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 атаки. Вместо формирования строки с литералами безопаснее использовать параметризованный запрос

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

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