MySQL εφιάλτες: Δύο μέρες και συνεχίζω…

by Stefanos Kofopoulos • On 06-01-2007 • AT 9:49 pm • 32 ΣΧΟΛΙΑ
Computing Τεχνολογία

mysql logo

Έχουν περάσει δύο μέρες και ακόμα δεν έχω καταφέρει να μεταφέρω την MySQL βάση του pestaola.gr σε άλλο hosting plan με τα ελληνικά να εμφανίζονται σωστά. Αυτός είναι ο λόγος που δεν ενημερώνω το blog.

Η MySQL είναι ένα υπέροχο DBMS κατασκευασμένο από Σουηδούς. Αυτό εξηγεί γιατί το προεπιλεγμένο collation είναι swedish_general_ci που στην περίπτωση μου παίζει (διαβάζετε ελληνικά τώρα ε;) αλλά όχι κατά την μεταφορά της βάσης αλλού.

Έχω δοκιμάσει τα πάντα: Αλλαγή του collation σε tables αλλά και στην βάση, μετατροπή του encoding με το iconv, μεταφορά αυτούσιου του ήδη λειτουργικού setup στο νέο περιβάλλον.

Το phpMyAdmin κάνει τρελά για αυτό αποφάσισα να χρησιμοποιήσω τον καλό μου φίλο mysqldump* που δυστυχώς παρά το –skip-set-charset και –default-character-set=greek αρνείται να με βοηθήσει.

Έγραψα στην (mt) να κοιτάξουν τα character sets που ενώ σύμφωνα με αυτό το άρθρο θα έπρεπε να υποστηρίζουν greek στην πραγματικότητα παίρνω το παρακάτω μήνυμα λάθους: mysqldump: Character set ‘greek’ is not a compiled character set and is not specified in the ‘/usr/share/mysql/charsets/Index.xml’ file.

Θα εκτιμούσα την βοήθεια και τις γνώσεις σας επί του θέματος.

*από post του adamo για τον δικό του καλό φίλο tcpdump

CareerNet.gr: Βρείτε τώρα τη δουλειά που σας ταιριάζει!

32 ΣΧΟΛΙΑ

  1. 1. Στην παλιά βάση δεδομένων, που φαντάζομαι είναι η MySQL4, τι character set είχες;
    2. Το backup της βάσης δεδομένων όταν το ανοίξεις με Notepad ή Wordpad διαβάζεται;
    3. Αν το ανοίξεις με Notepad++ τι character set λέει ότι είναι;

    Μην ψάχνεις για Greek στην MySQL 4.1 γιατί απλά τα ξέχασαν… και προέκυψε ένα υπέροχο bug. Επίσης ξέχασε το PHPmyAdmin για backup, κάντο με mysqldump και συνέχισε από εκεί.

    Αν χρησιμοποιείς iconv κάνε τα δεδομένα της βάση σου utf8 και στη συνέχεια στο my.ini της MySQL θέσε ως default-character-set=utf8 και τέλος…

  2. 1. Ναί, είναι MySQL 4.1.1. Για άγνωστο λόγο παίζει το swedish_general_ci . Έπαιξε και το άφησα όταν μεταφέρθηκα στο (gs) της (mt).

    2. Όχι

    3. Πού το βλέπω αυτό;

    Δυστυχώς MySQL 4.1.1 έχει ο server και αν είναι έτσι όπως τα λες την έχω βάψει.

  3. Στο επισημο site της MySQL, στα downloads έχει μαζί με κάποια άλλα καλούδια ένα υπέροχο προγραμματάκι ονόματι MySQL Migration Toolkit (δυστυχώς μόνο στην έκδωση για windows). Πιστεύω οτι θα σε βοηθήσει αρκετά…

  4. Προφανώς στην προηγούμενη MySQL είχες swedish οπότε κινέζικα με κινέζικα είναι συμβατά…

    Αν έχεις το Notepad++ (αν δεν το έχεις κατέβασε το, είναι open source) δεξιά κάτω λέει τι κωδικοποίηση έχουν οι χαρακτήρες. Επίσης τα ελληνικά στη βάση δεδομένων δεδομένων διαβάζονται στο Notepad++ ή εμφανίζονται και εκεί κινέζικα;

    Αν είναι κινέζικα και στο Notepad++ τότε έχει πρόβλημα η προηγούμενη βάση δεδομένων σου και το πρόβλημα κληρονομήθηκε.

    Τέλος αν μπορείς κάνε post τα κινέζικα της βάσης σου, γιατί κινέζικα με κινέζικα διαφέρουν και μπορούμε να καταλάβουμε πως προήλθαν.

  5. Τα ελληνικά εμφανίζονται κινέζικα και στην βάση. Το WordPress είναι ρυθμισμένο να βγάζει greek-iso και αυτό είναι και το encoding που βγαίνει η σελίδα. Δεν βγάζει νόημα όμως πως δουλεύει.

    Δεν είχα προσέξει αυτή την χρήσιμη λεπτομέρεια στη δεξιά κάτω γωνία.

    Ανάλογα με το export που έχω κάνει γράφει ANSI ή UTF-8.

    Αυτό που με ανησυχεί είναι ότι και στην περίπτωση που είναι UTF-8 οι δηλώσεις για τα tables είναι σε latin όπως παρακάτω:

    DROP TABLE IF EXISTS `wp_categories`;
    CREATE TABLE `wp_categories` (
    `cat_ID` bigint(20) NOT NULL auto_increment,
    `cat_name` varchar(55) collate utf8_general_ci NOT NULL default ”,
    `category_nicename` varchar(200) collate utf8_general_ci NOT NULL default ”,

    Δεν ξέρω αν έχει νόημα να αλλάξω σε όλη την βάση ανάλογες εγγραφές.

  6. Για όσους αντιμετωπίζουν παρόμοιο πρόβλημα υπάρχει και αυτή η λύση. Φαίνεται πως έχει νόημα αλλά ακόμα δεν το έχω δοκιμάσει.

  7. Όταν το κάνεις export σαν UTF8 και ανοίγεις το αρχείο στο Notepad++ διαβάζονται ή ότι και να κάνεις είναι κινέζικα; Μόνο αυτό ουσιαστικά έχει σημασία.

    Σε μία διεθνή εταιρεία web hosting, δεν υπάρχει περίπτωση να ρυθμιστεί η MySQL στο my.ini να τρέχει μόνο Greek, αφού έχει πελάτες από όλο τον κόσμο.

    Το πιθανότερο είναι ότι η εταιρεία που σε φιλοξενεί έχει σαν server default την utf8 ή στη χειρότερη περίπτωση τη utf8.

    Στην περίπτωση που σε utf8 διαβάζονται τα ελληνικά στη βάση, θα κάνεις μαζική αντικατάσταση του “collate utf8_general_ci” με μιά κενή εγγραφή.

    Στη συνέχεια αοφύ δημιουργήσεις τη νέα βάση και αλλάξεις το collation σε utf8_general_ci, θα εισάγεις τη βάση από command line (ξέχνα το phpmyadmin).

    Αν οι χαρακτήρες δεν διαβάζονται σε καμία περίπτωση στον κώδικα, τότε έχουν αλλοιωθεί και θα ακολουθήσεις άλλη στρατηγική για να τους επαναφέρεις (εκεί να δεις εφιάλτη :). Και τότε όμως υπάρχει λύση.

    Θερμή παράκληση να προσθέσεις μιά γραμμή από τα αλλοιωμένα ελληνικά για να δούμε από τη έχουν προέλθει (πχ αλλαγή από iso-8859-7 σε utf8 στη βάση και μετά σε utf κατά την εξαγωγή).

  8. Ακόμα και όταν γίνεται export σε UTF8 δεν βλέπω ελληνικά. Σε αυτή την περίπτωση τα ελληνικά φαίνονται σαν να θέλουν αλλαγή encoding ενώ όταν το export γίνεται σε utf8 τα ελληνικά βγαίνουν σαν ανάποδα Γ.

    Θα σου δείξω ένα δείγμα αργότερα.

  9. Αν και χαίρομαι (χαιρέκακα) να ακούω για προβλήματα της MySQL, θα σου προτείνω το εξής. Κάνεις export την db επιλέγοντας encoding αυτό που θα σου επιτρέψει να τα δείς τα ελληνικά σωστά ανοίγοντας το .sql αρχείο στο notepad. Κατά τη γνώμη μου, δοκίμασε το swedish_general, το lati1 και το utf8.
    Αφού βρεί το “σωστό” encoding, ανοίγεις το sql αρχείο με κάποιο πρόγραμμα για SQL editing (π.χ. Microsoft SQL Server Management Studio και επιλέγεις την αποθήκευσή του ως utf8. Στο νέο server έχει επιλέξει οπουδήποτε βλέπεις για encoding και collation, UTF8 και επιλέγεις run script (εννοείται δεν έχεις βάση). Τρέχεις στο sql αρχείο που έχεις προηγουμένως σώσει ως utf8 το οποίο σου ξαναδημιουργεί τη βάση με όλα τα δεδομένα σου. Τέλος κοιτάς στο κώδικα του WordPress στο connection string της MySQL να διαβάζει τα δεδομένα από τη βάση με utf8 κωδικοποίηση (περισσότερα στο documentation της MySQL). Τέλος, αλλάζεις την κωδικοποίηση της σελίδας σε utf8 και μην ξανακούσω άνθρωπο να λέει ότι το greek-iso ή το greek-windows αρκεί για όταν έχεις μόνο ελληνικά στο site γιατί θα τα πάρω. :-)
    Μόνο μία κωδικοποίηση υπάρχει και αυτή είναι η utf8. Σε όλα utf8… πάει με όλα όπως η coca cola! :-)

  10. Από τη βιασύνη μου δεν πρόσεξα το τελευταίο comment σου. Επέλεξε export ως swedish_general.

    BTW. Δεν ξέρω από MySQL, εγώ είμαι παιδί του Bill Gates. SQL και Άγιος ο Θεός! Απλά έχω πάθει ότι και εσύ με βάση πελάτη που έπρεπε να μεταφέρω από τον άλλο server στον δικό μου, μέχρι να του αλλάξω όλο το site σε .NET/MSSQL :-)

  11. Όταν λες ότι μοιάζουν σαν λάθος κωδικοποίηση, εμφανίζονται περίπου σαβν ΙΙΙΙΙ;

  12. Παράδειγμα σε UTF8 από το Notepad++: ÌåãÜëá êÝñäç ãéá ôçí

    Παράδειγμα σε latin από το Notepad++: 26f7570732920c3a8c3a120c3b0c39cc3b1c3a5c3a920c3adc39dc3af20

  13. Σε αυτο το αρχειο που παιρνεις με το export της παλιας αν κανεις ενα file τι σου λεει περι encoding;

    Ενα iconv -f swedish_mumbo_jumbo|latin|iso8859-7|whatever -tUTF8 palio_export -o to_be_imported τι αρχειο βγαζει; Ειναι Human readable πια?

    (Και το γνωστο Κλισε: Τι ειναι το wordpad και το notepad;)

  14. Η γραμμή που έδωσες σου λέει “μεγάλα κέρδη για την”.

    Κατέβασε το UniRed από το http://www.esperanto.mv.ru/UniRed/ENG/index.html και εγκατέστησε το.

    Ξεκίνα με το αρχείο της MySQL με κωδικοποίηση σε UTF8. Άνοιξε το αρχείο σε Notepad++ και αντέγραψε όλο το περιεχόμενο. Τρέξε το UniRed και επικόλλησε τα δεδομένα σε αυτό. Στη συνέχεια μέσα από το UniRed αποθήκευσε σε αρχείο με κωδικοποίηση cp-1252. Άνοιξε το τελικό αρχείο με Notepad++ και δες τα Ελληνικά σου.

    Επέλεξε όλο το περιεχόμενο στο Notepad++ και κάνε αποκοπή. Μετά πήγαινε Μορφή -> Κωδικοποίηση UTF8 και κάνε επικόλληση πάλι μέσα στο Notepad++. Σώσε το αρχείο.

    Αν φτάσεις μέχρι εδώ χωρίς πρόβλημα πες μου για να συνεχίσουμε με τη βάση.

  15. Έλαβα το email σου αλλά δεν έχω προλάβει να κάνω τίποτα ακόμα.

  16. Αν θες να παίξεις ελληνικά σε 4.1 και να κρατησεις τα data σου χωρίς conversion και τέτοια κάνε τα εξής:

    Export την βάση μέσω mysqlfront, phpmyadmin ότι θες τέλος πάντων.
    Το αρχείο στο Notepad το σώζεις σαν ANSI και ΟΧΙ σαν utf-8. Κάνε ένα check ότι στο Create Table statement έχει sto τέλος (μετά το type=ISAM το charset=Greek (αν θες βάλε αμέως μετά κι ένα collation=greek_general_ci ή greek_general_cs ανάλογα αν θες case insensistive ή case sensitive – αν δεν βάλεις τίποτα παίρνει το default greek_general_ci ). Ρϊξε την βάση σου μέσω Phpmyadmin (να τσεκάρεις πως αν σε ρωτάει τι encodong είναι το αρχείο πρέπει να του πεις greek).

    Άντε και την έριξες και πας να την διαβάσεις από το site σου και βγαίνει κουκουρούκου. Πήγαινε εκεί που ανοίγεις το connection και πρόσθεσε αυτό αμέσως αφού ανοίξεις το connection:

    mysql_query(“set names ‘greek'”);

  17. Παιδιά το ίδιο πρόβλημα και εγώ και δεν ξέρω τι να κάνω. Απο το notepad βλέπω κανονικούς χαρακτήρες, στην βάση κανονικούς, αλλά όταν τρέχω το forum εμφανίζεται με ?????. Τα φώτα σας παρακαλω γιατι θα τρελαθώ :S

  18. @oplakiaz: Έβγαλα άκρη με την βοήθεια του lefteris και λίγο UNIX. Θα βγάλω σχετικό post με λεπτομέρεις πολύ σύντομα.

  19. Κάντο όσο πιο γρήγορα φίλε Titanas μπορείς γιατί πνίγομαι. Πρέπει να αλλάξω server και θα μείνει το site στον αέρα.. :S

  20. Προσφατα επρεπε να κανω το ιδιο ακριβως πραγμα. δε ξερω αν σου λεω οτι ανακαλυψα τον τροχο, εν πασει περιπτωσει..

    ΠΑΛΙΟΣ ΣΕΡΒΕΡ

    >mysqldump -uroot -p123456 –default-character-set=greek ηβασησου > /tmp/εναονομα.dat
    (123456 το πασγουορντ)

    ΝΕΟΣ ΣΕΡΒΕΡ
    > mysql -uroot -p1234356;
    $ set foreign_key_checks = 0;
    $ create database ηβασησου collate greek_general_ci;
    $ use ηβασησου;
    $ source /tmp/εναονομα.dat
    $ set foreign_key_checks = 1;
    $ exit;

    ελπιζω να μην ειναι αυτο που ΗΔΗ κανεις και να ειναι αυτο που θα πιασει!
    νικος.

  21. ευχαριστώ φίλε Νίκο. Το δοκιμάζω και ενημερώνω.

  22. δυστυχως το ιδιο.. :S αυτή την φορά και στην βάση.. :S Δεν ξέρω τι να κάνω. Ειλικρινά έχω τρελαθεί.

  23. Δυστηχως το ιδιο προβλημα εχουμε και εμεις τις τελευταιες 2 μερρες..ο provider πηγε απο 4.0.2 σε 4.1 και ολη βαση μας εγινε ?????????????
    πραγματικα δεν ξερω τι να πω..3 χρονια forum και content το καναμε 1000 φορες import και εχουμε παρει τα @@ μας

  24. @doc: Γιατί ποτέ δεν βρήκα μια σωστή λύση

  25. Ψαχνοντας να βρω τη λύση στο προβλημα βρέθηκα στο blog σου. Τελικα η λύση δώθηκε με το UltraEdit32. Ανοίγεις στο UltraEdit32 το αρχείο SQL και κάνεις convert UTF8 to UNICODE (file->conversions). Τα ελληνικά εμφανίζονται κανονικά.

  26. opoios exei provlima me ta ellinika na mou steilei mail na tou pw ti 8a kanei ! h lysh einai e3eis katevaste to ems sql manager
    http://sqlmanager.net/products/mysql/manager/
    kai deyteron poli shmantiko
    otan kanete edit tin vash
    vazeis charset utf8
    utf general
    alla sta pedia pou einai text h varchar vazeis pali utf
    ama den ala3eis kai to colation sta pedia
    den kaneis douleia
    properties -meta fields-edit field name-meta sto charset koitas to pedio
    na einai utf8 kai to colation
    utf8_general_ci
    mono etsi 8a doulepsei
    an den ala3eis to colation tou pediou den doulevei :)
    email me for questions !

    utf8_general_ci

  27. Gia sas.
    Akolouthisa tia odigies toy filou lefteris kai katafera meta apo poly kopo na vlepw sosta ta ellinika mesa apo tin vasi moy. Mesa apo tin php efarmogi (phpbb sygkekrimena) vlepw erotimatika (????) !! Kamia idea gia to ti faei kai pws mporei na diorthothei ?

    PS Mesa apo to phpmyadmin vlepw sosta ta ellinika.

  28. Paidia help,
    Douleuw me java , mySQL Server kai IIS ena project. Ola pane kala otan kanw backup tin basi apo tin efarmogi mou alla an epileksw na kanw restore tote mou epistrefei :

    mysql: Character set ‘greek’ is not a compiled character set and is not specified in the ‘C:\mysql\\share\charsets\Index.xml’ file

    Yparxei kamia lusi ??

    Thank you..

  29. Chris h, το έχεις δει αυτό; Character Set Support

  30. @ Titanas : Όχι, αλλά Θα ήθελες σε παρακαλώ να γίνεις λιγάκι πιο συγκεκριμένος, σχετικά με το πρόβλημα μου ?? Έχω “ φάει τα νιάτα μου ” να ψάχνω.. δεν μπορώ να βρω τίποτα!
    Σ’ ευχαριστώ ..

  31. Chris h , μου φαίνεται ότι δεν έχει βάλει η MySQL σου να υποστηρίζει Ελληνικά ή απλά δεν χρησιμοποιείς το σωστό charset ή αυτό που η MySQL όπως είναι στημένη θεωρεί σωστό. Έχεις πειράξει το my.ini ? Δες εδώ mysql client tool could not find ../share/charsets folder and fails.

  32. check this! http://graphicmaniacs.com/note/mysql-query-to-change-character-set-connection-encoding-collation-etc/comment-page-1/#comment-76076

    SOLVED my MySql encoding issue.

    (crossed your blog while looking for the solution :P )

Top

Show Buttons
Hide Buttons