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

Откуда:
Сообщений: 106
Что имеем:
1. Некая программа написанная на VC++ 2003, которая использует ODBC драйвер для конекта к SQL SERVER 2008.
2. SQL SERVER распологается на WINDOWS 2008, программу запускаем из под WINDOWS XP.
3. SQL процедура написанная на VC++ 2003. Эта процедура использует ODBC драйвер для конекта к своемуже SQL серверу. SQL SERVER 2008 тотже самый и работает на WINDOWS 2008.
4. Таблица в базе с некоторым набором полей, среди них есть несколько с типом VARCHAR. В этих полях хранятся строки в кодировке UTF-8.

Что в итоге получается:
Когда я запускаю отдельную программу из под WINDOWS XP, данные из SQL сервера приходят в нормальном (UTF-8) виде.
А когда тотже самый код исполняется во встроенной процедуре, на месте "особенных" символов приходит полная ерунда типа - "???»?? ?·?°?????????° ???° ???‹?????? ?????µ??" причем эти вопросики имеют код символа "3F".

Проблема думаю ясна, но хотелось бы узнать может быть возможно как-то по-другому конектиться обратно к своемуже SQL серверу из встроенной процедуры, либо использовать какуюто альтернативу ODBC?
30 июн 09, 14:14    [7359127]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
Glory
Member

Откуда:
Сообщений: 104760
truper
4. Таблица в базе с некоторым набором полей, среди них есть несколько с типом VARCHAR. В этих полях хранятся строки в кодировке UTF-8.

И как это вы собрались хранить Unicode в поле VARCHAR ?
30 июн 09, 14:22    [7359175]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
truper
Member

Откуда:
Сообщений: 106
Glory
truper
4. Таблица в базе с некоторым набором полей, среди них есть несколько с типом VARCHAR. В этих полях хранятся строки в кодировке UTF-8.

И как это вы собрались хранить Unicode в поле VARCHAR ?


Вот так и хранится :) Там просто лежат символы типа "егисС", если такой код вставить в HTML и поставить кодировку страницы UTF-8 то все замечательно отображается.
30 июн 09, 14:26    [7359191]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
Glory
Member

Откуда:
Сообщений: 104760
truper
Glory
truper
4. Таблица в базе с некоторым набором полей, среди них есть несколько с типом VARCHAR. В этих полях хранятся строки в кодировке UTF-8.

И как это вы собрались хранить Unicode в поле VARCHAR ?


Вот так и хранится :) Там просто лежат символы типа "егисС", если такой код вставить в HTML и поставить кодировку страницы UTF-8 то все замечательно отображается.

И как выглядит комнада, которую получает сервер, чтобы положить эти символы в таблицу ?
30 июн 09, 15:06    [7359459]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
truper
Member

Откуда:
Сообщений: 106
select top 50 id, [server], sender_login, sender_name, account, [subject], [message] from mail_stock where [state] = 1 order by [server], id asc
30 июн 09, 15:12    [7359494]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
Glory
Member

Откуда:
Сообщений: 104760
truper
select top 50 id, [server], sender_login, sender_name, account, [subject], [message] from mail_stock where [state] = 1 order by [server], id asc

Хм. select уже умеет ложить данные в таблицы ?
30 июн 09, 15:22    [7359552]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
truper
Member

Откуда:
Сообщений: 106
Не совсем понял что вы имеете ввиду.
В таблицу данные ложатся при помощи обычного insert into ... (..., ..., ...) values (..., ..., ...)
а забираются при помощи select как я уже выше написал.
Да и дело даже не в том как они ложатся а почему они так поразному забираются.
Посмотрел используемые драйверы ODBC, они оказались идентичными.
30 июн 09, 15:33    [7359637]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
Konst_One
Member

Откуда:
Сообщений: 11513
кладутся

PS
смотрите свои локали на разных ваших компах
30 июн 09, 15:35    [7359655]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
truper
Member

Откуда:
Сообщений: 106
Локали разные, на windows 2008 английская а на windows XP русская. Я вот только непонимаю, если лежат в таблице данные, неважно какие, почему SQL или ODBC берет на себя право их конвертить во всякую ерунду.
Данные вставляются в таблицу именно под windows 2008 и из нее же забираются уже кривыми, как это понимать. Единственно что они туда вставляются с помощью DBLIB а забираются уже при помощи ODBC.
К примеру PHP работающий на томже серваке забирает данные (с помощью DBLIB) из этой таблицы вполне корректно, также как и SMS.
Мне кажется что виноват именно ODBC.

Может быть както можно обойти это преобразование, например привести к какомуто типу который не будет попадать под такую конвертацию.
30 июн 09, 15:51    [7359759]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
Konst_One
Member

Откуда:
Сообщений: 11513
nvarchar() вместо varchar()
30 июн 09, 15:54    [7359786]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
truper
Member

Откуда:
Сообщений: 106
привел к типу nvarchar(max) ноль реакции

select id, [server], sender_login, sender_name, account, [subject],
cast([message] as nvarchar(MAX)) as 'message'
from mail_stock where [state] = 1 order by [server], id asc

Судя по всему локаль играет некую роль.
30 июн 09, 16:07    [7359864]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
Konst_One
Member

Откуда:
Сообщений: 11513
collation ещё есть, как для поля в таблицы так и для базы в целом
30 июн 09, 16:11    [7359901]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
dima.dp.ua
Member

Откуда:
Сообщений: 42
select id, [server], sender_login, sender_name, account, [subject], 
cast([message] as nvarchar(MAX)) COLLATE SQL_Latin1_General_CP1251_CI_AS as 'message' 
from mail_stock where [state] = 1 order by [server], id asc
Это как пример, надо подобрать что подойдет в вашем случае.
30 июн 09, 17:36    [7360462]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
truper
Member

Откуда:
Сообщений: 106
Дело в том, что мне не нужна какаято определенная кодировка, потому как язык у меня может быть и русский и эстонский и польский и т.п.
Как тогда быть?
30 июн 09, 17:39    [7360477]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
Konst_One
Member

Откуда:
Сообщений: 11513
nvarchar() будет хранить такие данные нормально, а вот за показ клиенту отвечает ваше клиентское приложение, если оно не умеет работать с UNICODE, то у вас будут проблемы
30 июн 09, 17:40    [7360486]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
truper
Member

Откуда:
Сообщений: 106
Показ это одно, и это уже моя проблема.
А у меня проблема в том что драйвер ODBC возвращает не те данные которые лежат в таблице, сейчас попробую изначально поля в таблице сделать nvarchar() посмотрим что будет.
30 июн 09, 17:48    [7360530]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
truper
Member

Откуда:
Сообщений: 106
Создал таблицу с полями nvarchar(), все тоже самое.
Может кто подскажет как использовать OLE для конекта к SQL? В инете пока ничего путного не нашел.
30 июн 09, 18:15    [7360647]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36801
truper
Создал таблицу с полями nvarchar(), все тоже самое.
Может кто подскажет как использовать OLE для конекта к SQL? В инете пока ничего путного не нашел.
И запрос, который вставляет в нее данные, тоже поменяли?
30 июн 09, 18:16    [7360650]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
truper
Member

Откуда:
Сообщений: 106
Гавриленко Сергей Алексеевич
truper
Создал таблицу с полями nvarchar(), все тоже самое.
Может кто подскажет как использовать OLE для конекта к SQL? В инете пока ничего путного не нашел.
И запрос, который вставляет в нее данные, тоже поменяли?

Менял и так и сяк... и ничего
30 июн 09, 18:54    [7360764]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36801
truper
Менял и так и сяк... и ничего
"и ничего" - это текст ошибки? "так и сяк" - это текст команд?

Будем дальше в Штирлица играть?
30 июн 09, 18:57    [7360774]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
truper
Member

Откуда:
Сообщений: 106
Никакой ошибки небыло, просто возвращается неверный текст.
30 июн 09, 19:03    [7360790]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36801
truper
Никакой ошибки небыло, просто возвращается неверный текст.
Чем возвращается? Из таблицы с полями каких типов данных? Какой командой вы туда эти данные записали?

Хоспаде, не получается "так и сяк", попробуйте "вот так и вот эдак". Делов-то.
30 июн 09, 19:07    [7360800]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
truper
Member

Откуда:
Сообщений: 106
Посмотрел в винде XP какие языки стоят для не юникод текста, их очень много выбрано галочками. Думаю поэтому остальные языки и нормально както конвертируются.
Посмотрел что в винде 2008 стоит только английский язык. Также нашел добавление новых языков, но там их нет в списке. Есть диалог для загрузки их с диска, но вот где их брать непонятно.
30 июн 09, 19:07    [7360801]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36801
truper
Посмотрел в винде XP какие языки стоят для не юникод текста, их очень много выбрано галочками. Думаю поэтому остальные языки и нормально както конвертируются.
Посмотрел что в винде 2008 стоит только английский язык. Также нашел добавление новых языков, но там их нет в списке. Есть диалог для загрузки их с диска, но вот где их брать непонятно.
Ну, в линуксе еще что-нибудь посмотрите, в макоси.
30 июн 09, 19:08    [7360807]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с получением данных из SQL 2008 (W2008) ODBC  [new]
truper
Member

Откуда:
Сообщений: 106
Гавриленко Сергей Алексеевич
truper
Никакой ошибки небыло, просто возвращается неверный текст.
Чем возвращается? Из таблицы с полями каких типов данных? Какой командой вы туда эти данные записали?

Хоспаде, не получается "так и сяк", попробуйте "вот так и вот эдак". Делов-то.


С помощью ODBC из VC++ с помощью запроса
select id, [server], sender_login, sender_name, account, [subject], cast([message] as nvarchar(MAX)) COLLATE SQL_Latin1_General_CP1251_CI_AS as 'message' from mail_stock where [state] = 1 order by [server], id asc

вот как создана таблица
CREATE TABLE [dbo].[mail_stock](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[server] [varchar](255) NOT NULL,
[sender_login] [int] NULL,
[sender_name] [varchar](64) NULL,
[account] [int] NOT NULL,
[subject] [nvarchar](128) NOT NULL,
[message] [nvarchar](max) NULL,
[create_date] [datetime] NOT NULL,
[try_date] [datetime] NULL,
[send_date] [datetime] NULL,
[state] [int] NOT NULL,
[error] [varchar](512) NULL
) ON [PRIMARY]

записывал я так
declare @mess varchar(max)
declare @subj varchar(max)
select @mess = theme from web_mail_stock where id = 65568
select @subj = theme from web_mail_stock where id = 65568
select @mess = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body>' + @mess + '</body></html>'
update mail_stock
set [subject] = @subj,
[message] = @mess
where id = 1

апдейтил я потому что изначально в таблице mail_stock уже были тестовые данные на английском. Поэтому я их заменяю на данные в кодировке UTF-8
30 июн 09, 19:11    [7360816]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить