Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
0 / 0 / 0
Регистрация: 02.05.2021
Сообщений: 21

Кодировка SQL Server

24.08.2021, 16:32. Показов 4891. Ответов 4

Студворк — интернет-сервис помощи студентам
Задача: посчитать уникальные слова в тексте, используя БД.
Проблема: Когда я явно добавляю слова на кириллице, то всё работает отлично, но стоит мне начать добавлять их из файла, они начинают заменяться на знаки '?'.
Использую Sublime Text 3, там кодировка задана - 'UTF-8'.
В Visual Studio я понятия не имею, как посмотреть используемую кодировку SQL Server`a.
Уже пытался менять кодировки явно, до добавления слов в БД, после вывода из БД, но всё без толку.
Примеры попыток перекодировки слов:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        static private string Win1251ToUTF8(string source)
        {
            Encoding utf8 = Encoding.GetEncoding("utf-8");
            Encoding win1251 = Encoding.GetEncoding("windows-1251");
            byte[] utf8Bytes = win1251.GetBytes(source);
            byte[] win1251Bytes = Encoding.Convert(win1251, utf8, utf8Bytes);
            source = win1251.GetString(win1251Bytes);
            return source;
        }
 
        static string UTF8ToWin1251(string sourceStr)
        {
            Encoding utf8 = Encoding.UTF8;
            Encoding win1251 = Encoding.GetEncoding("Windows - 1251");
            byte[] utf8Bytes = utf8.GetBytes(sourceStr);
            byte[] win1251Bytes = Encoding.Convert(utf8, win1251, utf8Bytes);
            return win1251.GetString(win1251Bytes);
        }
Вот часть функции с добавлением слова в БД:
C#
1
2
3
4
5
uniqueWord = UTF8ToWin1251(uniqueWord.ToLower());
string insertUniqueWord = "INSERT INTO UniqueWords (Name, Number) VALUES ('" + uniqueWord + "', " + number + ")";
SqlCommand sqlCommand = new SqlCommand(insertUniqueWord, sqlConnection);
sqlCommand.ExecuteNonQuery();
sqlConnection.Close();
Прикрепил пример содержащихся слов в БД.
Я так понял, на стадии занесения слов, возникает проблема с кодировками.
Так же приложил документ, с которого берутся слова.
Миниатюры
Кодировка SQL Server  
Вложения
Тип файла: txt file1.txt (1.3 Кб, 2 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.08.2021, 16:32
Ответы с готовыми решениями:

Microsoft SQL Server Compact Edition в SQL Server Management Studio Express
Не могу понять как настроить SQL Server Management Studio Expres чтоб открывать и создавать бд sql ce. В менеджере просто нет возможности...

Настройка SQL Server 2008 для работы с SQL Server Management Studio
Доброго времени суток. Подскажите пожалуйста, что нужно сделать для того, чтобы SQL Server Management Studio соединялось с SQL сервером ?...

Добавление файла *.mdf. Ошибка "Должен быть установлен и запущен экспресс-выпуск SQL Server 2005 или SQL Server 2008"
Установлена Visual Studio 2010 и SQL Server 2008 R2 Standard. Хочу добавить в приложение файл базы данных *.mdf, но пишет: "должен...

4
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,891
Записей в блоге: 1
24.08.2021, 16:36
f5d5, покажите код чтения файла
0
 Аватар для Andrey-MSK
3341 / 2228 / 387
Регистрация: 14.08.2018
Сообщений: 7,519
Записей в блоге: 4
24.08.2021, 17:04
f5d5, MS SQL Server по умолчанию понимает UNICODE.
Для того чтобы он понял, что используется UNICODE, текстовые данные должны быть оформлены вот так
T-SQL
1
INSERT INTO MyTable (Field1, Field2) VALUES (N'Текст на любом языке', 456)
И поля в таблице, которые их принимают, должны иметь тип NVARCHAR, NCHAR.
N - UNICODE

Добавлено через 5 минут
Цитата Сообщение от f5d5 Посмотреть сообщение
C#
1
string insertUniqueWord = "INSERT INTO UniqueWords (Name, Number) VALUES ('" + uniqueWord + "', " + number + ")";
Name - служебное слово, его нужно экранировать - [Name]

Добавлено через 20 минут
f5d5, вот вам пример вставки данных на ADO .NET, тут используются параметры в которых объявляются типы данных в таблицах БД - SqlDbType = SqlDbType.NVarChar - вот это и есть UNICODE.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public static GenPlan InsertPosition(EObject eObject, string kks, string gpName)
{
    GenPlan genPlan = new GenPlan();
    string sqlText = "INSERT INTO dbo.tblGenPlan (ID_EObject, KKS, GPName) " +
        "VALUES (@eoID, @kks, @gpName); SELECT @newID = SCOPE_IDENTITY();";
 
    using (SqlConnection connection = new SqlConnection(_connectionString))
    {
        try
        {
            connection.Open();
 
            SqlCommand sqlCommand = new SqlCommand(sqlText, connection)
            {
                CommandType = CommandType.Text
            };
            SqlParameter paramEO = new SqlParameter
            {
                ParameterName = "@eoID",
                Value = eObject.IDEObject,
                SqlDbType = SqlDbType.Int,
                Direction = ParameterDirection.Input
            };
            sqlCommand.Parameters.Add(paramEO);
            SqlParameter paramKks = new SqlParameter
            {
                ParameterName = "@kks",
                Value = kks,
                SqlDbType = SqlDbType.NVarChar,
                Size = 50,
                Direction = ParameterDirection.Input
            };
            sqlCommand.Parameters.Add(paramKks);
            SqlParameter paramName = new SqlParameter
            {
                ParameterName = "@gpName",
                Value = gpName,
                SqlDbType = SqlDbType.NVarChar,
                Size = 255,
                Direction = ParameterDirection.Input
            };
            sqlCommand.Parameters.Add(paramName);
            SqlParameter paramId = new SqlParameter
            {
                ParameterName = "@newID",
                SqlDbType = SqlDbType.Int,
                Direction = ParameterDirection.Output
            };
            sqlCommand.Parameters.Add(paramId);
 
            sqlCommand.ExecuteNonQuery();
 
            genPlan.IDGenPlan = (int)sqlCommand.Parameters["@newID"].Value;
            genPlan.IDEObject = eObject.IDEObject;
            genPlan.KKS = kks;
            genPlan.GPName = gpName;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    return genPlan;
}
0
0 / 0 / 0
Регистрация: 02.05.2021
Сообщений: 21
24.08.2021, 17:21  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
char[] separators = { ' ', ',', '.', '!', '?', '"', ';', ':', '[', ']', '(', ')', '\n', '\r', '\t' };
            List<string> uniqueWords;
 
StreamReader reader = new StreamReader(pathToFile); // беру ссылку на файл
            DB db = new DB(connectionString);
 
            string line = "";
            while ((line = reader.ReadLine()) != null) // начинаю брать всё построчно
            {
                uniqueWords = new List<string>(line.Split(separators)); // разделяю строку на раздельные слова 
                foreach (var uniqueWord in uniqueWords)
                {
                    if (db.CheckUniqueWord(uniqueWord) == -1) // проверяю есть ли такое слово в базе данных
                    {
                        db.InsertUniqueWord(uniqueWord); // добавляю уникальное слово в бд
                    }
                    else
                    {
                        db.IncreaseNumberUniqueWords(uniqueWord); // увеличиваю счетчик конкретного уникального слова на 1
                    }
                }
            }
- Мне писать также, только в кавычках, верно?

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
SqlCommand sqlCommand = new SqlCommand(sqlText, connection)
            {
                CommandType = CommandType.Text
            };
            SqlParameter paramEO = new SqlParameter
            {
                ParameterName = "@eoID",
                Value = eObject.IDEObject,
                SqlDbType = SqlDbType.Int,
                Direction = ParameterDirection.Input
            };
            sqlCommand.Parameters.Add(paramEO);
- Мне не достаточно использовать только букву 'N', чтобы дать понять, что это UNICODE?
0
 Аватар для Andrey-MSK
3341 / 2228 / 387
Регистрация: 14.08.2018
Сообщений: 7,519
Записей в блоге: 4
24.08.2021, 17:32
Цитата Сообщение от f5d5 Посмотреть сообщение
Мне писать также, только в кавычках, верно?
вот ваш запрос
C#
1
string insertUniqueWord = "INSERT INTO UniqueWords ([Name], [Number]) VALUES (N'" + uniqueWord + "', " + number + ")";
Цитата Сообщение от f5d5 Посмотреть сообщение
Предлагаете таким же путём добавлять в БД слова?
А почему бы и нет Тем более с параметрами гораздо безопаснее в плане инъекций и нет путаницы с типами данных.

Добавлено через 51 секунду
И поля в таблице, которые их принимают, должны иметь тип NVARCHAR, NCHAR.
Это сделали?

Добавлено через 5 минут
Цитата Сообщение от f5d5 Посмотреть сообщение
Мне не достаточно использовать только букву 'N', чтобы дать понять, что это UNICODE?
N используется только в тексте запроса (когда строки клеете, или в SSMS), если использовать параметры, то там автоматически всё поставится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.08.2021, 17:32
Помогаю со студенческими работами здесь

Как перекатить с sql server на другой sql server
Как перекатить базу данных с одного sql сервера на другой

Совместимость Microsoft SQL Server 2008 и Microsoft SQL Server 2016
Здравствуйте!Столкнулся с такой проблемой:написал программу на Visual Studio 2010(по техническим причинам стоял ХР и только 2010 работал) в...

Подключение Базы данных SQL SERVER/OPEN SERVER(PHP.MYADMIN)
Здравствуйте, как подключить базу данных через строку, брал ее из источника данных, требует поставщика, пробовал разное, никак не могу...

Как передать значение из dateTimePicker в запрос sql Microsoft SQL Server
Здравствуйте! Подскажите пожалуйста,как правильно передать значения из dateTimePicker в запрос sql ? Я пока что не очень силен во всем...

Как работать с БД SQL, не привязнной к MS SQL Server 2005
Ув. программисты. Помогите пожалуйста разобраться. Только начал работать с MS SQL Server 2005, и сразу столкнулся с проблемой. У меня есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru