Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Русские символы из временного хранилища  [new]
Maksym_t
Member

Откуда: Екатеринбург
Сообщений: 29
Всем привет!
Столкнулся с проблемой русских символов в ответа на запрос из .net приложения.
Суть: Приложение генерирует запрос -
+ Текст запроса
DECLARE @tbl TABLE(MESS VARCHAR(10) COLLATE Cyrillic_General_CI_AS);
INSERT INTO @tbl VALUES('Привет');
SELECT MESS FROM @tbl;

Запрос выполняется при помощи метода SqlCommand.ExecuteScalar(), так же можно SqlDataAdapter.Fill(какая ни-нибудь таблица)
В обоих случаях в ответ получаю - ??????

Однако, если текст запроса будет -
+ Другой текст запроса
CREATE TABLE test (MESS VARCHAR(10) COLLATE Cyrillic_General_CI_AS);
INSERT INTO test VALUES('Привет');
SELECT MESS FROM test;

В ответ получаю - Привет

Кто-нибудь знает почему так получается?
+ Версия сервера
Microsoft SQL Server 2005 - 9.00.5000.00 (Intel X86) Dec 10 2010 10:56:29 Copyright (c) 1988-2005 Microsoft Corporation Express Edition on Windows NT 6.1 (Build 7601: Service Pack 1)

Collation сервера - Cyrillic_General_CI_AS
Collation базы данных - Cyrillic_General_CI_AS
И на всякий случай проверил Collation tempdb - Cyrillic_General_CI_AS
5 мар 15, 10:49    [17345444]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Maksym_t,

Вывод зависит от того в контексте какой базы вы этот запрос выполняете.
Проверьте еще раз скорее всего неправильно посмотрели коллашен базы либо сервера.
для проверки
select databasepropertyex(db_name(), 'collation')
DECLARE @tbl TABLE(MESS VARCHAR(10) COLLATE Cyrillic_General_CI_AS);
INSERT INTO @tbl VALUES('Привет');
SELECT MESS FROM @tbl;
5 мар 15, 11:11    [17345577]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
Maksym_t
Member

Откуда: Екатеринбург
Сообщений: 29
WarAnt,
Выполнил из приложения
select databasepropertyex(db_name(), 'collation')

Получил из приложения: Cyrillic_General_CI_AS

К сообщению приложен файл. Размер - 4Kb
5 мар 15, 11:21    [17345628]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
o-o
Guest
какая неделя кириллическая :)
коллэйшен TempDB ни при чем, столбцы табличной переменной получают либо коллэйшен базы, если явно не указать,
либо явно указанный.

Maksym_t,
первый запрос у вас выполняется в контексте некириллической базы, оттуда и вопросики.
передавайте кириллицу юникодом:
INSERT INTO @tbl VALUES(N'Привет');
5 мар 15, 11:22    [17345633]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
o-o
Guest
ну так надо в тот запрос, что вопросики выдает, вписать опрос коллэйшена,
а то спасибо, в разных базах выполняете
DECLARE @tbl TABLE(MESS VARCHAR(10) COLLATE Cyrillic_General_CI_AS);
INSERT INTO @tbl VALUES('Привет');
SELECT MESS, databasepropertyex(db_name(), 'collation') 
FROM @tbl;
5 мар 15, 11:24    [17345651]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
Maksym_t
Member

Откуда: Екатеринбург
Сообщений: 29
o-o,
С этой бедой 2-ой день не знаю чего делать. То, что вы предложили тоже пробовал, понять не могу в чем тут дело.
На всякий случай, запускаю из приложения:
DECLARE @tbl TABLE(MESS VARCHAR(10) COLLATE Cyrillic_General_CI_AS);
INSERT INTO @tbl VALUES(N'Привет');
SELECT MESS,databasepropertyex(db_name(), 'collation') AS [collation] FROM @tbl;

И все равно в ответ получаю, одни вопросы.

К сообщению приложен файл. Размер - 5Kb
5 мар 15, 11:32    [17345710]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Maksym_t
На всякий случай, запускаю из приложения:

из SSMS результат нормально выводится?
5 мар 15, 11:40    [17345755]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
o-o
Guest
может, у вас случай, обратный вот этому?
Проблема с кодировкой русских букв после переноса базы
и 1251 перекодируется по правилам 1252???
вряд ли.

можно:
отследить профайлером, что идет на сервер;
попробовать выполнить из студии;
сменить тип колонки на юникодный и тогда уж точно никаких больше вопросиков
DECLARE @tbl TABLE(MESS NVARCHAR(10) COLLATE Cyrillic_General_CI_AS);
INSERT INTO @tbl VALUES(N'Привет');
SELECT MESS FROM @tbl;
5 мар 15, 11:42    [17345769]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
Maksym_t
Member

Откуда: Екатеринбург
Сообщений: 29
Knyazev Alexey,
Да, в SSMS все отлично.
5 мар 15, 11:44    [17345784]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
o-o
Guest
Maksym_t
Да, в SSMS все отлично.

ну так приложение или криво шлет, или криво отображает.
смотрите профайлером, что шлет
5 мар 15, 11:47    [17345817]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
Maksym_t
Member

Откуда: Екатеринбург
Сообщений: 29
o-o,
Нужно почитать, что такое профайлер, и как им пользоваться. Не приходилось его использовать.

По второй части, с NVARCHAR(), тоже пробовал, там вообще красота выходит.

К сообщению приложен файл. Размер - 5Kb
5 мар 15, 11:48    [17345825]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Maksym_t
По второй части, с NVARCHAR(), тоже пробовал, там вообще красота выходит.

так тут 100% ваше приложение коряво написано! правьте его...
SSMS - это тоже всего лишь обычное приложение, но оно, в отличии от вашего, написано верно
5 мар 15, 11:54    [17345867]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
o-o
Guest
ну хорошо, давайте выведем байтики:
SELECT MESS, cast(mess as varbinary(100))
5 мар 15, 11:54    [17345868]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
Maksym_t
Member

Откуда: Екатеринбург
Сообщений: 29
Knyazev Alexey,
Так как мое приложение может быть криво написано, если я использую методы, написанные Microsoft.
В первом сообщение написал, какими методами получаю, данные из БД, или вы хотите сказать, что есть какие-то волшебные настройки в строке подключения, позволяющие корректировать ответные данные из разных источников (типы таблиц) внутри одного экземпляра SQL?
5 мар 15, 11:56    [17345895]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
o-o
Guest
ответные данные правильные, просто кто-то их некорректно выводит.
вы байты-то покажите, если одинаковые, то программа перед выводом корежит,
а если разные, то сама форма не в состоянии отобразить
5 мар 15, 12:02    [17345926]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
Maksym_t
Member

Откуда: Екатеринбург
Сообщений: 29
o-o,
К сожалению, встроенный в VS2008 менеджер просмотра данных DataTable показывает System.Byte[] в столбце с массивом байтов/
Если значение ячейки в которой должен быть массив байтов преобразовать к переменной типа Byte()
 Dim bytes() As Byte = CType(DT.Rows(0).Item(1), Byte())

То в bytes будет следующее содержание: 253,255,253,255,253,255,253,255,253,255,253,255

В SSMS показывает 0x1F0440043804320435044204

На каком моменте происходит конвертация не понятно, так как при запросе из "Не временной" таблицы, все отображается корректно.
%)
5 мар 15, 12:15    [17346005]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
Maksym_t
Member

Откуда: Екатеринбург
Сообщений: 29
Maksym_t,
Это для NVARCHAR который выдает, символы в виде, карт.
Если Столбец в SQL будет VARCHAR то массив следующий: 63,63,63,63,63,63
в SSMS: 0xCFF0E8E2E5F2
5 мар 15, 12:19    [17346025]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
o-o
Guest
хотите сказать, что нельзя вывести в форму результат этого кода?
o-o
ну хорошо, давайте выведем байтики:
SELECT MESS, cast(mess as varbinary(100))
5 мар 15, 12:19    [17346027]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
Maksym_t
Member

Откуда: Екатеринбург
Сообщений: 29
o-o,
При отладке, просматриваю содержимое объекта DT типа DataTable в VS2008 используется класс System.Data.DataView
Который отображает менеджер, в котором можно выбрать, конкретную таблицу из набора данных (DataSet), в данном случае таблица одна, выбирать нечего.
И в этом самом менеджере просмотра, массив байтов не отображается =)

К сообщению приложен файл. Размер - 29Kb
5 мар 15, 12:29    [17346084]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
вас уже 2 раза просили показать результат запроса:

SELECT MESS, cast(mess as varbinary(100))
5 мар 15, 12:40    [17346155]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
Maksym_t
Member

Откуда: Екатеринбург
Сообщений: 29
Разобрался, есть еще одна тонкость, о которой не упомянул.

Запрос храниться на диске, приложение его считывает с диска и запускает на выполнение.
Во время считывания, и происходит корректировка, получается что, запрос уже выполняется со знаками ?????? в место русских символов.

Как я так затупил...
Искреннее спасибо, всем кто предлагал варианты решения.
5 мар 15, 12:56    [17346272]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Maksym_t
Разобрался, есть еще одна тонкость, о которой не упомянул.

Запрос храниться на диске, приложение его считывает с диска и запускает на выполнение.
Во время считывания, и происходит корректировка, получается что, запрос уже выполняется со знаками ?????? в место русских символов.

Как я так затупил...
Искреннее спасибо, всем кто предлагал варианты решения.


автор
Так как мое приложение может быть криво написано, если я использую методы, написанные Microsoft.
5 мар 15, 13:05    [17346343]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
Maksym_t
Member

Откуда: Екатеринбург
Сообщений: 29
Knyazev Alexey,

Ради прикола, вот метод который считывал файл.

Dim reader As New StreamReader(nameFile)
GetFileFromFileSystem = reader.ReadToEnd()


А, что пришлось сделать, чтобы все работало корректно


Dim reader As New StreamReader(nameFile, Encoding.Default)
GetFileFromFileSystem = reader.ReadToEnd()


По логике Microsoft, при чтении файла, не указав кодировку "По умолчанию", он будет выбирать ее "наугад", или у него есть еще какое-то месть "Еще более по умолчанию" =)))))

Ну вот ни как не ожидал такого подвоха.
5 мар 15, 13:09    [17346386]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
Arm79
Member

Откуда: МО, Раменское
Сообщений: 3697
Maksym_t
По логике Microsoft, при чтении файла, не указав кодировку "По умолчанию", он будет выбирать ее "наугад",

Наугад вы пишите приложения. А в документации четко написано, что кодировка по умолчанию utf-8. Encoding.Default для вас скорее всего windows-1251
5 мар 15, 15:21    [17347478]     Ответить | Цитировать Сообщить модератору
 Re: Русские символы из временного хранилища  [new]
Maksym_t
Member

Откуда: Екатеринбург
Сообщений: 29
Arm79,

В этой жизни много чего делаю на угад. Даже когда нажимаю на педаль тормоза, у меня нет 100% уверенности, что я остановлюсь. В силу того, что я не знаю насколько шероховат асфальт, не пробьет ли мне резину и многое-многое другое. В общем случае я опираюсь на опыт и предсказания, что позволяет мне в абсолютно большинстве случаев остановится там, где и планировал.
Вот и в данном случае я опирался на элементарную логику, если не указать, кодировку, то будет выбрана по умолчанию. Однако чем руководствовались Майкрософт, когда делали выбор в пользу утф вместо по умолчанию, ни как не пойму. Их логику мне вообще последнее время достаточно сложно понять.

Да, я не прочитал полностью документацию по данному методу, ошибка моя.
5 мар 15, 23:06    [17349826]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить