Создал таблицу в БД, но при добавлении символов кириллицы, символ '?', знаю что это проблемы с кодировкой, но как установить 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 атаки. Вместо формирования строки с литералами безопаснее использовать параметризованный запрос
Комментариев нет:
Отправить комментарий