MySQL a binarni data
Karel Zak
zakkr na zf.jcu.cz
Čtvrtek Prosinec 7 11:54:15 CET 2000
On Thu, 7 Dec 2000, Michal Krause wrote:
> > Proc? Moc nechapu v cem mas problem. Pokud tam protlacis INSERT tak
> > UPDATE je to same ne?
>
> Ja tamale neprotlacim ani ten INSERT. Prece kdyz mam nejakou strukturu a
Aha :-)
> v ni binarni data (treba ta cisla), nemuzu je nijak rozumne hodit do
> query, protoze by tam mohla byt nula. Jde to jedine prevodem na string,
> coz delam v podstate ted a chci se toho zbavit.
>
> > Uz je to par let co do zminovane SQL (ano i ja pouzivam MySQL:-)
>
> Neuveritelne :)
>
> > ukladam binarni data z PHP bez vetsich problemu, pochopitelne, ze je
> > nutne ta data nejak osetrit (napr. PHP - AddSlashes() apod.).
>
> A co udela AddSlashes s takovymto polem bajtu:
>
> 12 34 39 40 49 6 50 0 48 3 90 48 5 96
string addslashes(string str);
Returns a string with backslashes before characters that need to be
quoted in database queries etc. These characters are single quote ('),
double quote ("), backslash (\) and NUL (the null byte).
> > Nebo muzes ty binarni data prevadet na ASCII nejakym lepsim zpusobem
> > (base64, prevod na hexa apod.) - pokud na tom ASCII trvas :-)
>
> Ja naopak vubec na ASCII netrvam, chci proste mit libovolna binarni
> data, treba obrazek (to sice neni zrovna ten muj pripad, ale pro
> demonstraci to staci). Dejme tomu, ze ho chci dostat do databaze ze
> sveho programu v C. Takze nactu do bufferu obsah souboru a potom udelam
> co? INSERT INTO table VALUES ('ten_muj_buffer_i_s_nulami') asi tezko :)
^^^^^^^^^^^^^^^^^^^^^^^^^
Prevedes ten buffer na neco "nezavadneho".
Chlape co se do toho PHP podivat:
char *php_addslashes(char *str, int length, int *new_length, int should_free)
{
/* maximum string length, worst case situation */
char *new_str = (char *) emalloc((length?length:(length=strlen(str)))*2+1);
char *source,*target;
char *end;
char c;
PLS_FETCH();
for (source=str,end=source+length,target=new_str; (c = *source) || source<end; source++) {
switch(c) {
case '\0':
*target++ = '\\';
*target++ = '0';
break;
case '\'':
if (PG(magic_quotes_sybase)) {
*target++ = '\'';
*target++ = '\'';
break;
}
/* break is missing *intentionally* */
case '\"':
case '\\':
if (!PG(magic_quotes_sybase)) {
*target++ = '\\';
}
/* break is missing *intentionally* */
default:
*target++ = c;
break;
}
}
*target = 0;
if (new_length) {
*new_length = target - new_str;
}
if (should_free) {
STR_FREE(str);
}
return new_str;
}
Coz? ... mam u tebe pivo - dalo mi to cca 2min hledani :-)
Karel
Další informace o konferenci Databases