Baza de date MySQL recodare

Mysql suportă multe codificări și este adesea o durere de cap pentru administratorii de sistem.

Cea mai frecventă problemă - păsărească în loc de litere românești. Și se întâmplă că site-ul va apărea normal, dar de căutare va produce, nu același lucru, în cazul în care nu ceva ce trebuie căutat.
Acest lucru se datorează faptului că textul de pe server în codificarea greșită, sau textul este dat clientului în codificarea greșită.

Setări MySQL responsabile pentru codificare:
character_set_client - codificare în care datele vor fi primite de la client
character_set_connection - codarea implicită pentru toate că, în cadrul conexiunii nu are nici o criptare
character_set_database - codarea implicită pentru baza de date
character_set_filesystem - codificare pentru sistemul de fișiere
character_set_results - codificare, în care rezultatul va fi selectat
character_set_server - codificare, în care serverul se execută
character_set_system - codificare, care sunt specificate identificatori MySQL întotdeauna UTF8
character_sets_dir - dosar cu codificări

Valorile lor pot fi vizualizate într-o astfel de interogare: VARIABILE SHOW LIKE „% char“;
MariaDB [(none)]> VARIABILE SHOW LIKE '% character_set';
----------------------------------------------------+
VARIABLE_NAME Valoare
----------------------------------------------------+
character_set_client utf8
character_set_connection utf8
character_set_database latin1
binar character_set_filesystem
character_set_results utf8
character_set_server latin1
character_set_system utf8
character_sets_dir / usr / share / mysql / charsets /
----------------------------------------------------+

După ce instalați serverul MySQL, caracterul setat implicit Latin1 expuse.
În consecință, variabilele globale enumerate mai sus vor fi în Latin1.
Baza implicită, respectiv, și o masă, de asemenea.

Luați în considerare obținerea unui utf8 codificare normală în baza noastră de date?
1. Faceti o groapa de baze de date, notând necesare noi Encoding:
mysqldump --u utilizator -p --default-caractere-set = Latin1 --skip-set-charset dbname> benă-latin1.sql

2. va converti fișierul nostru haldei-latin1.sql utf8 de codificare dorită
inconv -f ISO-8859-1-benă latin1.sql -t UTF8> benă-utf8.sql
Alocarea tastelor după cum urmează:
-f latin1 - conversia de la Latin1 codare (mod latin1 și izo-8859-1 este același lucru)
-t UTF-8 - în codificarea UTF-8
benă-latin1.sql - fișier pe care îl vom converti
benă-utf8.sql - rezultatele sunt scrise în fișierul
Uneori, există caracteristici speciale: la o anumită inconv poziție poate emite o eroare cu privire la un caracter nevalid în fișierul de intrare.
Această problemă este cauzată de faptul că baza are un tabel de tip pată de cerneală. Și, ca o consecință iconv nu poate skonvertit datele și se oprește cu o eroare.
Pentru acest lucru nu sa întâmplat, groapa de gunoi trebuie să fie făcut cu parametrul indicație care exportă de bază cu câmpuri Blob într-un format binar.
mysqldump --u utilizator -p --default-caractere-set = Latin1 --skip-set-charset --hex-pată de cerneală dbname> benă-latin1.sql
Apoi, are loc conversia fără probleme.

3. În plus, toate referirile la Latin1 care codifică înlocui fișierul de imagine în utf8:
pisică-benă utf8.sql | sed 's / charset = Latin1 / charset = utf8 / g'> haldei-utf8-new.sql

4. Apoi, eliminați baza noastră de date și de a recrea cu codificarea corectă:
mysql --user = user -p --execute = "DROP DATABASE databasename; CREATE DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ci;"

5. Completați groapa de gunoi a bazei de date nou creată
mysql --user = root -p --default caractere-set = utf8 databasename

Variabilele globale sunt inițializate la valorile implicite atunci când porniți serverul MySQL, sau să accepte valorile setate în my.cnf fișier de configurare.
Acum ne pentru a edita fișierul my.cnf, și să-l să arate așa:
[Mysqld]
datadir = / var / lib / mysql
soclu = / var / lib / mysql / mysql.sock
simbolic-link-uri = 0
set de caractere-server = utf8
set de caractere client = utf8
colaționare-server = utf8_unicode_ci
init-connect = 'NUME SET utf8'

[Mysqld_safe]
log-error = / var / log / MariaDB / mariadb.log
pid-file = / var / run / MariaDB / mariadb.pid

Am reporni baza de date si verificare a noastra:
MariaDB [(none)]> VARIABILE SHOW LIKE '% character_set';
+--------------------------+----------------------------+
| VARIABLE_NAME | Valoarea |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binar |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | / Usr / share / mysql / charsets / |
+--------------------------+----------------------------+
8 rânduri în set (0.00 sec)