Diacritice salvate aiurea în DB

Nu știu cum și de ce, blogul avea setat un encoding dubios care făcea ca toate diacriticele să fie salvate aiurea în DB (chiar dacă erau afișate corect). Am observat asta prima dată în urmă cu câteva luni dar n-am dat atenție prea mare. Aseară am avut parte de niște erori micuțe iar azi am încercat să rezolv.

Așa arătau diacriticele în DB:

După cum ŠŸtiŠ£i, Microsoft a observat, cu mult timp în urmă, că e 

Rezolvarea? Foarte simplă! Faci un dump al bazei de date, salvezi fișierul pe server, lângă fișierul respectiv pui un fix.php cu următorul conținut:

$sql ='sql_dump.sql';
$db = fopen( $sql, "r+");
$content = fread($db, filesize($sql));
$fixed = str_replace( 
array( "ă", "Ä‚", "â", "Â", "È™", "ŠŸ", "Ș", "Šž", "È›", "Š£", "Èš", "î", "Î", "€", "„", "”" ), 
array( "ă",  "Ă",  "â",  "Â",  "ș",  "ș",  "Ș",  "Ș",  "ț",  "ț",  "Ț",  "î",  "Î",  "€"  , "„",   "”"  ), $content  );
echo $fixed;

Posibil ca primul array să aibe nevoie de un mic update (cauți în DB texte cu diacritice și vezi dacă se „pupă” aberațiile; eu am făcut un post nou în care am turnat toate diacriticele și am verificat doar pe acel post).

Accesezi fix.php și îl salvezi. Dacă ai o DB masivă ar fi mai bine să pui fișierul respectiv într-un folder fără index și să-i dai click dreapta -> save as.

Imporți fișierul proaspăt salvat într-o bază de date nouă (întâi de test, să nu strici jucăriile) și apoi în producție.

Enjoy!

8 Comentarii to “Diacritice salvate aiurea în DB”

  1. Uite aici încă o “traducere”, am avut de prelucrat o bază de date cu tot felul de nume străine:

    $source =       array('é', 'ü', 'è', 'ó', 'á', 'Ö', 'ã', 'ö', 'ÿ', 'ć', 'Š™', ''', 'ç', 'å', 'É', 'æ', 'Ó', 'ø', 'š', 'Š‚', 'Š¼', 'Š„', 'ú', 'ë', 'Š‘', 'ä');
    $replace =      array('é',  'ü',  'è',  'ó',  'á',  'Ö',  'ã',  'ö',  'ÿ',  'ć',  'ř',   "'",   'ç',  'å',  'É',  'æ',  'Ó',  'ø',  'š',  'ł', 'ż', 'ń',   'ú', 'ë',  'ő', 'ä');
    

    Încă un detaliu: a trebuit să schimb collation-ul (nu știu cum se traduce) în utf8_general_ci pe coloanele unde aveam diacritice. Eu am făcut un script care mi-a parsat tabelele respective din baza de date pentru că erau foarte mari (una dintre ele avea 10 milioane rânduri) și ieșea un dump gigantic.

  2. Staicu Ionuț-Bogdan

    @Laurențiu: Mulțumesc pentru completare!

    Pentru WordPress poți folosi ceva de genul ăsta. Pentru altceva… folosești un script custom :D

    BTW: utf8_unicode_ci este recomandat în locul lui utf8_general_ci (din punct de vedere al corectitudinii; dacă performanța e cea care te interesează, utf8_general_ci este soluția);

  3. Ionuţ Botizan

    Meh, dacă ai un articol despre “Cum să miști o piatră cu gândul” și vrei să poată fi căutat și după “cum sa misti o piatra cu gandul”, atunci ai face bine să folosești utf8_general_ci.

    În fine, nu cumva problema ta ține de conexiunea la MySQL pe care o face WordPress-ul? Din câte știu eu, gunoiul de WP nu face mysql_query('SET NAMES utf8') după stabilirea conexiunii la baza de date, așa că ai putea s-o faci tu manual.

  4. Ionuţ Botizan

    Offtopic: Ce faci tizule, nu afișezi (gr)avatare cu rating PG? :))

  5. Staicu Ionuț-Bogdan

    Nu știu ce gravatar ai tu, dar asta mi-e setarea :)

  6. Ionuţ Botizan

    Atunci ți-e stricat plugin-ul, că văd că nu pune în src-ul imaginii parametrul pentru rating:
    http://www.gravatar.com/avatar/edbf67ef37b45b43a594ce8800265348?s=80
    VS
    http://www.gravatar.com/avatar/edbf67ef37b45b43a594ce8800265348?s=80&r=PG

  7. Staicu Ionuț-Bogdan

    Gata mă, te-am rezolvat. Acum să te prind că nu-mi lași cel puțin două comentarii/articol! :D

  8. nu mai bine faci un search-replace sql?

Show trackbacks

Ți-a plăcut articolul? Lasă un comentariu!

You can insert code snippets using BBcode:
[js].[/js] [html].[/html] [php].[/php] [css].[/css]
You can also use some HTML tags:
<blockquote>.</blockquote> <code>.</code> <a href="">.</a> <strong>.</strong> <em>.</em>