MySQL HELP! Запись 0x00 байта

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Smapt, 17 Jan 2009.

  1. Smapt

    Smapt Elder - Старейшина

    Joined:
    29 Jan 2008
    Messages:
    31
    Likes Received:
    32
    Reputations:
    3
    Записываю в MySQL базу из Си строку, запись идет до первого 0x00 байта, а дальше пустота... Можно-ли с этим боротся?
     
    #1 Smapt, 17 Jan 2009
    Last edited: 17 Jan 2009
  2. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    как?
     
  3. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    0x00 - это ж конец строки
     
  4. Smapt

    Smapt Elder - Старейшина

    Joined:
    29 Jan 2008
    Messages:
    31
    Likes Received:
    32
    Reputations:
    3
    Примерно так:
    Code:
    char text[] = {0x10,0x011,0x12,0x00,0x10,0x11};
    MYSQL_RES * UPDATE = QUERY("base","UPDATE `user` SET text='%s' WHERE name='name'",text);
    
    
    MYSQL_RES * QUERY(char * base, char * Format, ...)
    {
    	va_list ap;	      // For arguments
    	va_start( ap, Format );
    	int buff_size = _vscprintf(Format,ap)+1;
    	char * buff = new char[buff_size];
    	vsprintf(buff,Format,ap);
    	
    	char * queryPtr = new char[1024];
    
    	mysql_select_db(mysql,base);
    	sprintf(queryPtr,"use %s",base);
    
    	mysql_query(mysql,queryPtr);
    	sprintf(queryPtr, buff);
    
    	if (mysql_query(mysql,queryPtr))
    	{
    		va_end  ( ap );
    		delete[] buff; delete[] queryPtr;
    		return 0;
    	}
    	else
    	{
    		va_end  ( ap );
    		delete[] buff; delete[] queryPtr;
    		return mysql_store_result(mysql);
    	}
    }
    


    Спасибо, я знаю.
     
  5. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    Может у тебя конфликт типов данных? Т.е. ты передаешь hex-данные в текстовое поле...
     
  6. Smapt

    Smapt Elder - Старейшина

    Joined:
    29 Jan 2008
    Messages:
    31
    Likes Received:
    32
    Reputations:
    3
    Передавать пробовал по все что только можно, char, blob и т.д. Результат всегда одинаковый записывает до 0x00 и обрезает строку. Если не ошибаюсь раньше в MySQL был тип данных binary , так вот в строку типа binary(100) данные записывались нормально(т.е. вместе с 0x00), а сечас bin почему-то убрали
     
  7. oRb

    oRb Elder - Старейшина

    Joined:
    9 May 2008
    Messages:
    294
    Likes Received:
    581
    Reputations:
    256
    нуль байт запиши как char(0)
    те запрос будет вида:
    UPDATE `user` SET text=CONCAT('abc',char(0),'abc') WHERE name='name'

    И поле text, наверно, должно иметь тип blob.
     
  8. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    В таком случае, ты спрашиваешь примерно следующее: как записать конец строки в середину строки. Используй, к примеру, blob
     
    1 person likes this.
  9. Smapt

    Smapt Elder - Старейшина

    Joined:
    29 Jan 2008
    Messages:
    31
    Likes Received:
    32
    Reputations:
    3
    Всем спс, строка обрезалась ещё до отправки...
    хм... возникает новый вопрос нельзяли без особого изврата отучить sprintf от "обрезания" ??
     
    #9 Smapt, 17 Jan 2009
    Last edited: 17 Jan 2009
  10. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    А обязательно sprintf() юзать? Можно заменить strcat() :)
     
  11. __mad

    __mad Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    strcat() тоже будет обрезать до 0x00, нада использовать memcpy