SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 07.08.2010 12:07:57

whitesail
Участник
Зарегистрирован: 07.08.2010
Сообщений: 6

проблема с null byte при сохранении бинарного массива ODBC (C API)

Помогите решить или укажите, пожалуйста, соответствующую ветку по след. проблеме:

Требуется записать массив бинарных данных, включая нули, в таблицу со след структурой из программы на С.
Происходит обрезание данных на нулевом байте 0x00.

Структура sql-таблицы major:
(smallint) Frame_number | (longblob) ch1 | (longblob) ch2 | (longblob) ch3 | (longblob) ch4 | (smallint) frame_size

Соединение с базой установлено, вся необходимая память указателям выделена...

1. Подготовка запроса:

SQLPrepare(sql_hStmt,_T("INSERT INTO major(Frame_number,CH1,CH2,CH3,CH4,frame_size) VALUES(?,?,?,?,?,?)"),SQL_NTS);

2. Привязка параметров:

SQLBindParameter(sql_hStmt, 1, SQL_PARAM_INPUT, SQL_INTEGER, SQL_INTEGER, 0,0, &frames_parsed, 0, 0);
SQLBindParameter(sql_hStmt, 2, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_VARBINARY, 0,0, v, bufsz, 0);
SQLBindParameter(sql_hStmt, 3, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_VARBINARY, 0,0, v, bufsz, 0);
SQLBindParameter(sql_hStmt, 4, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_VARBINARY, 0,0, v, bufsz, 0);
SQLBindParameter(sql_hStmt, 5, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_VARBINARY, 0,0, v, bufsz, 0);
SQLBindParameter(sql_hStmt, 6, SQL_PARAM_INPUT, SQL_INTEGER, SQL_INTEGER, 0,0, &datasize, 0, 0);

где v - массив данных, bufsz - его размер

3. Цикличное выполнение запроса

SQLExecute(sql_hStmt);

Версия MySQL - 5.5
Версия OBDC - Mysql ODBC 5.1

Отредактированно whitesail (07.08.2010 12:17:00)

Неактивен

 

#2 07.08.2010 15:08:21

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: проблема с null byte при сохранении бинарного массива ODBC (C API)

А ODBC 3.23 не пробовали?

Неактивен

 

#3 07.08.2010 15:19:11

whitesail
Участник
Зарегистрирован: 07.08.2010
Сообщений: 6

Re: проблема с null byte при сохранении бинарного массива ODBC (C API)

http://dev.mysql.com/doc/refman/5.1/en/ … -news.html

Самый ранний ODBC 3.51.11 (28 January 2005)

Неактивен

 

#4 07.08.2010 15:23:13

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: проблема с null byte при сохранении бинарного массива ODBC (C API)

Эм. Ну, значит, 3.51. В пятерке есть некоторое количество известных ошибок, но
так как новой функциональности в самом коннекторе нету (кроме возможности
использовать пароли из версий MySQL 4.1+), то можно пробовать использовать
третий.

Неактивен

 

#5 07.08.2010 15:27:47

whitesail
Участник
Зарегистрирован: 07.08.2010
Сообщений: 6

Re: проблема с null byte при сохранении бинарного массива ODBC (C API)

Ввиду информации на странице:
http://dev.mysql.com/doc/refman/5.1/en/ … query.html

написал:

mysql_query() cannot be used for statements that contain binary data; you must use mysql_real_query() instead. (Binary data may contain the “\0” character, which mysql_query() interprets as the end of the statement string.) In addition, mysql_real_query() is faster than mysql_query() because it does not call strlen() on the statement string.

Таким образом, полагаю, что подход обозначенный выше ошибочный в принципе. Вероятно, SQLVARCHAR наткнувшись на NULL byte желает мне всего хорошего...

Отредактированно whitesail (07.08.2010 15:29:27)

Неактивен

 

#6 07.08.2010 17:12:06

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: проблема с null byte при сохранении бинарного массива ODBC (C API)

Это то да, но ODBC должен правильно эскейпить данные при запросах.
Т.е. если бы Вы делали strcat, то тогда я бы Вам это сразу и сказал. А тут
всё-таки ощущение, что драйвер не эскейпит. Ну, при условии, что Вы
ищете bufsz не через strlen wink

Неактивен

 

#7 08.08.2010 01:15:05

whitesail
Участник
Зарегистрирован: 07.08.2010
Сообщений: 6

Re: проблема с null byte при сохранении бинарного массива ODBC (C API)

Все проще оказалось: вместо нулевого байта надо передавать SQL_NULL_DATA.

Неактивен

 

#8 08.08.2010 20:39:16

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: проблема с null byte при сохранении бинарного массива ODBC (C API)

Честно говоря, не понял последней фразы. Как Вы передадите SQL_NULL_DATA
в строке "blah\0minor"?

Неактивен

 

#9 11.08.2010 02:43:51

whitesail
Участник
Зарегистрирован: 07.08.2010
Сообщений: 6

Re: проблема с null byte при сохранении бинарного массива ODBC (C API)

данные бинарные: "0xbb0xccSQL_NULL_DATA"

Неактивен

 

#10 11.08.2010 11:27:55

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: проблема с null byte при сохранении бинарного массива ODBC (C API)

Стало еще меньше понятно. Вы прямо строкой передаете SQL_NULL_DATA внутри
строки? Как оно тогда вообще работает?

Код:

celestia:~$ cat a.c
#include <stdio.h>
int main()
{
    char z[] = "0xbb0xccSQL_NULL_DATA";
    printf("%d\n", sizeof(z));
}
celestia:~$ gcc a.c
celestia:~$ ./a.out 
22

Неактивен

 

#11 11.08.2010 12:18:10

whitesail
Участник
Зарегистрирован: 07.08.2010
Сообщений: 6

Re: проблема с null byte при сохранении бинарного массива ODBC (C API)

Прошу прощения за поспешность в ответе, выложу весь код чуть позже.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson