Salvarea unui caracter intr-un field mysql

Um un caracter ciudatat, care atunci cand il pun intr-un input text si il savez in MySQL (cu php pdo) nu mai salveaza nimic de la acel caracter.

De exemplu: “Acest caracter :video_camera: nu este salvata” , ajunge in baza de date “Acest caracter”.

Se poate seta ceva general sau trebuie “sanitizat” stringul?

Verifica charsetul tabelului in care stochez acea informatie sa fie utf8. Ex: utf8_general_ci
Mai poti seta encodingul conexiunii catre dintre script si mysql cu SET NAMES UTF8;

tre sa pui utf8mb4 la tabela/camp.

1 Like

De ce utf8mb4?

Pentru ca ‘suporta’ emoji (banuiesc).

1 Like

Intr-adevar utf8mb4 pare ce trebui. Tx @AdrianBasalic

Momentan am scos din php caracterelw “bad”. Mai bine lipsa decat sa rupa continutul .

Urmeaza si modificarea tabelelor, dat mai complicat :slight_smile:

Teoretic, schimbatul tabelelor ar trebui sa fie safe. Practic insa nu e nicaieri garantat, asa ca e greu de luat decizia in productie.

Niste idei p-aci - http://stackoverflow.com/a/11840562/394589

@nush: intr-adevar, par a fi pasii la care ma gandeam si eu. Doar ca mai am si cateva servere slave + tabela e un pic cam mare (cativa Gb).

Oricum, trebuie sa o fac - dar nu pe caldura asta

Sper să mai țin bine minte:

Charset UTF8 la tabelă și câmp (s-a mai spus mai sus)

Primul query să fie:

“SET NAMES ‘utf8’”

Și ar trebui să fie ok.

Când am citit întrebarea m-am gândit direct la utf8_bin. Recunosc că habar n-aveam de utf8mb4.
Poți să explici, te rog, în câteva cuvinte care ar fi diferența între cele două? :slight_smile:

Pe scurt, poate reprezenta un set mult mai mare de caractere, pentru că folosește maxim 4 bytes per caracter, față de 3 bytes ai utf8. Pe lung, din docs:

The character set named utf8 uses a maximum of three bytes per character and contains only BMP characters. As of MySQL 5.5.3, the utf8mb4 character set uses a maximum of four bytes per character supports supplemental characters:

  • For a BMP character, utf8 and utf8mb4 have identical storage characteristics: same code values, same encoding, same length.
  • For a supplementary character, utf8 cannot store the character at all, while utf8mb4 requires four bytes to store it. Since utf8 cannot store the character at all, you do not have any supplementary characters in utf8 columns and you need not worry about converting characters or losing data when upgrading utf8 data from older versions of MySQL.
1 Like

unele emoji sunt pe 4 bytes, utf8-bin e pe 3 bytes, mb4 e pe 4 asa ca poti salva si caracterele unicode pe 4 bytes.

1 Like

Ce aiureală. De ce i-or mai fi zis utf8 dacă nu implementează full utf8?

https://mathiasbynens.be/notes/mysql-utf8mb4

2 Likes

probabil pentru ca la momentul la care s-a ales marimea maxima in bytes (in anii '90), 3 erau more than enough.

Din câte știu eu, standardul UTF-8 a suportat mereu 4 bytes.