Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / кириллица в MS SQL, BINARY / 19 сообщений из 19, страница 1 из 1
30.10.2007, 12:10:17
    #34904149
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кириллица в MS SQL, BINARY
приветствую уважаемых спецов!
сразу извиняюсь за избитую тему про кодировку, но ответа на свой вопрос я не нашла.

Есть MS SQL Server 2000/2005 с таблицей с полем BINARY. Нужно писать/читать в него кириллицу.

Проект MFC создан в студии 2005.
Мои действия:
- готовлю строку wchar_t с русскими буквами,
- конверитурую wchar_t-строку в UTF-8 c помощью ф-ции WideCharToMultiByte (CP_UTF8...),
- выполняю запрос, н-р:
Код: plaintext
1.
2.
3.
char query[ 100 ];
sprintf ("insert into table1 (field1) values (cast('%s' as binary(50)))", UTF-8_строка);
ExecuteQuery (query);
- вычитываю рез-тат.
Оказывается, что в поле BINARY записались кракозябры.

Запросы выполняются через написанную мной (с вашей помощью, спасибо вам еще раз) функцию ExecuteQuery - она работает.

Проблема - как конвертировать кириллицу в UTF-8, чтобы использовать ее для записи/считывания в поле BINARY или в условиях запроса в сравнении?

P.S. использовать nchar, nvarchar не предлагайте, надо именно в binary
...
Рейтинг: 0 / 0
30.10.2007, 12:49:25
    #34904336
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кириллица в MS SQL, BINARY
используй параметры
...
Рейтинг: 0 / 0
30.10.2007, 13:04:37
    #34904431
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кириллица в MS SQL, BINARY
maXmoиспользуй параметры
параметры в чем?
если речь о WideCharToMultiByte, то вот как происходит кодирование:
Код: plaintext
1.
int destination_string_size = WideCharToMultiByte (CP_UTF8,  0 , src, - 1 , NULL,  0 , NULL, NULL);
WideCharToMultiByte (CP_UTF8,  0 , my_source_string, - 1 , my_destination_string, destination_string_size, NULL, NULL);
...
Рейтинг: 0 / 0
30.10.2007, 13:05:16
    #34904434
ZrenBy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кириллица в MS SQL, BINARY
Lenie запрос, н-р:
Код: plaintext
1.
2.
3.
char query[ 100 ];
sprintf ("insert into table1 (field1) values (cast('%s' as binary(50)))", UTF-8_строка);
ExecuteQuery (query);


А как насчет
Код: plaintext
1.
2.
wchar_t query[ 100 ];
. . .values (cast(N'%s' as binary( 50 )))...

и никакого UTF-8
...
Рейтинг: 0 / 0
30.10.2007, 13:12:18
    #34904463
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кириллица в MS SQL, BINARY
Lenieпараметры в чем?В запросе.
...
Рейтинг: 0 / 0
30.10.2007, 13:42:52
    #34904578
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кириллица в MS SQL, BINARY
ZrenByА как насчет
Код: plaintext
1.
2.
wchar_t query[ 100 ];
. . .values (cast(N'%s' as binary( 50 )))...

и никакого UTF-8

такой вариант работает, если захардкодить wchar_t строку, т.е. если сделать так:
Код: plaintext
1.
2.
3.
wchar_t *wstr = _wcsdup(L"кириллица");
char query[ 1024 ];
sprintf (query, "insert into _test (binar) values (cast(N'%s' as binary(50)))", wstr);
а если поместить в wstr значение любым другим способом (н-р, копированием из др. переменной), то в переменной query оказываются крякозябры. почему-то. щас пытаюсь втыкнуть почему.
...
Рейтинг: 0 / 0
30.10.2007, 13:44:11
    #34904585
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кириллица в MS SQL, BINARY
maXmo Lenieпараметры в чем?В запросе.какие параметры нужно использовать?
...
Рейтинг: 0 / 0
30.10.2007, 14:15:55
    #34904730
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кириллица в MS SQL, BINARY
Lenie
Код: plaintext
1.
2.
3.
wchar_t *wstr = _wcsdup(L"кириллица");
char query[ 1024 ];
sprintf (query, "insert into _test (binar) values (cast(N'%s' as binary(50)))", wstr);

извиняюсь, ошиблась
при таком способе тоже в query - крякозябры
всё нормально только когда в выражение запроса вместо wstr напрямую подставляется текст
...
Рейтинг: 0 / 0
30.10.2007, 14:21:48
    #34904755
ZrenBy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кириллица в MS SQL, BINARY
Lenie Lenie
Код: plaintext
1.
2.
3.
wchar_t *wstr = _wcsdup(L"кириллица");
char query[ 1024 ];
sprintf (query, "insert into _test (binar) values (cast(N'%s' as binary(50)))", wstr);

извиняюсь, ошиблась
при таком способе тоже в query - крякозябры
всё нормально только когда в выражение запроса вместо wstr напрямую подставляется текст

Э.... У вас, действительно, мешанина из char и wchar_t или это следствие Ctrl-C+Ctrl-V ?
...
Рейтинг: 0 / 0
30.10.2007, 14:27:40
    #34904771
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кириллица в MS SQL, BINARY
ZrenBy
Э.... У вас, действительно, мешанина из char и wchar_t или это следствие Ctrl-C+Ctrl-V ?

в char-строку я собираю SQL-выражение, к-рое потом передается в функцию как параметр для выполнения

а в wchar_t-строке хранится текст кириллица
...
Рейтинг: 0 / 0
30.10.2007, 14:58:02
    #34904868
ZrenBy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кириллица в MS SQL, BINARY
Lenie ZrenBy
Э.... У вас, действительно, мешанина из char и wchar_t или это следствие Ctrl-C+Ctrl-V ?

в char-строку я собираю SQL-выражение, к-рое потом передается в функцию как параметр для выполнения

а в wchar_t-строке хранится текст кириллица

В этом и проблема.

SQL-выражение должно быть wchar_t-строкой и параметр функции должен быть wchar_t-строкой
и компоненты доступа к MSSQL тоже должны работать с wchar_t-строкой.
Тогда все будет нормально.

Если это невозможно, тогда один выход - на клиенте формировать из wchar_t-строки
бинарное представление типа, 0xDD04E504...
...
Рейтинг: 0 / 0
30.10.2007, 15:34:28
    #34904992
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кириллица в MS SQL, BINARY
ZrenByВ этом и проблема.

SQL-выражение должно быть wchar_t-строкой и параметр функции должен быть wchar_t-строкой
и компоненты доступа к MSSQL тоже должны работать с wchar_t-строкой.
Тогда все будет нормально.
я неправильно построила строку с SQL-выражением. Вписала туда 'N' перед строкой, да к тому же передаю wchar_t-строку. Исправила:
Код: plaintext
1.
sprintf (query, "insert into _test (binar) values (cast(N'%s' as binary(50)))", char_строка_с_кириллицей);
А вычитываю результат из BINARY-поля в строку wchar_t - работает.

ZrenByЕсли это невозможно, тогда один выход - на клиенте формировать из wchar_t-строки
бинарное представление типа, 0xDD04E504...
скажите пжл, как это сделать:)

спасибо за помощь!
...
Рейтинг: 0 / 0
30.10.2007, 16:17:04
    #34905169
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кириллица в MS SQL, BINARY
Lenieкакие параметры нужно использовать?чем к скрулю подключаешься?
...
Рейтинг: 0 / 0
30.10.2007, 16:28:28
    #34905208
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кириллица в MS SQL, BINARY
если мфц/одбц, то читай в мсдне «Recordset: Parameterizing a Recordset (ODBC)».
...
Рейтинг: 0 / 0
30.10.2007, 16:39:43
    #34905251
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кириллица в MS SQL, BINARY
maXmoесли мфц/одбц, то читай в мсдне «Recordset: Parameterizing a Recordset (ODBC)».
а, ясно
нет, я подключаюсь ODBC API функциями SQLDriverConnect и др.
...
Рейтинг: 0 / 0
30.10.2007, 16:45:29
    #34905280
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кириллица в MS SQL, BINARY
тогда читай про SQLBindParameter
...
Рейтинг: 0 / 0
30.10.2007, 17:26:23
    #34905454
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кириллица в MS SQL, BINARY
maXmoтогда читай про SQLBindParameterSQLBindParameter работает с хранимыми процедурами, а у меня случай - выполнение запросов. ХП c кириллицей сдружила :)
...
Рейтинг: 0 / 0
30.10.2007, 17:39:51
    #34905499
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кириллица в MS SQL, BINARY
LenieSQLBindParameter работает с хранимыми процедурами, а у меня случай - выполнение запросов.да вроде и так должен работать:
msdnSQL_PARAM_INPUT. The parameter marks a parameter in an SQL statement that does not call a procedure, such as an INSERT statement, or it marks an input parameter in a procedure. For example, the parameters in INSERT INTO Employee VALUES (?, ?, ?) are input parameters , while the parameters in {call AddEmp(?, ?, ?)} can be, but are not necessarily, input parameters.
...
Рейтинг: 0 / 0
30.10.2007, 17:42:44
    #34905510
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кириллица в MS SQL, BINARY
maXmoда вроде и так должен работать:
[quot msdn]SQL_PARAM_INPUT. The parameter marks a parameter in an SQL statement that does not call a procedure, such as an INSERT statement, or it marks an input parameter in a procedure. For example, the parameters in INSERT INTO Employee VALUES (?, ?, ?) are input parameters , while the parameters in {call AddEmp(?, ?, ?)} can be, but are not necessarily, input parameters.:) спасибо
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / кириллица в MS SQL, BINARY / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]