#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 "Поддержка параметров сортировки и Юникода"
Комментариев нет:
Отправить комментарий