Πρόβλημα με ελληνικούς χαρακτήρες στην εντολή LOAD DATA INFILE

Συζητήσεις για την βάση δεδομένων MySQL και το phpMyAdmin

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
omerta22
Δημοσιεύσεις: 6
Εγγραφή: 21 Φεβ 2008 02:54

Πρόβλημα με ελληνικούς χαρακτήρες στην εντολή LOAD DATA INFILE

Δημοσίευση από omerta22 » 02 Φεβ 2013 13:32

Αν και έχω διαβάσει πολλά forums και λύσεις σχετικά με ελληνικούς χαρακτήρες και mysql δεν κατάφερα να λύσω το δικό μου πρόβλημα
Το πρόβλημα μου είναι το εξής:

Έχω μία βάση δεομένων με όνομα my_db η οποία έχει έναν πίνακα με όνομα words ο οποίος έχει δύο πεδία id:int(11) και word:varchar(40).

Τα collation της βάσης, του πίνακα και του πεδίου word είναι utf8_unicode_ci
Όσον αφορά το character set:

Κώδικας: Επιλογή όλων

character_set_client = utf8
character_set_connection = utf8
character_set_database = utf8
character_set_filesystem = binary
character_set_results = utf8
character_set_server = latin1
character_set_system = utf8
Επίσης έχω ένα αρχείο .csv αποθηκευμένο με κωδικοποίηση utf8 το οποίο έχει την εξής μορφή:

Κώδικας: Επιλογή όλων

null;ΑΝΘΡΩΠΟΣ
null;ΣΚΥΛΟΣ
...
Χρησιμοποιώ ένα php script για να κάνω load το αρχείο στη βάση:

Κώδικας: Επιλογή όλων

mysql_query("SET NAMES 'utf8'",$link)
mysql_query("LOAD DATA INFILE 'my_file.csv' INTO TABLE words
CHARACTER SET utf8
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n';");
όπου $link είναι το αναγνωριστικό της σύνδεσης με τη βάση.

Μέχρι εδώ όλα δουλεύουν ρολόι. Δηλαδή το php script εκτελείται και όταν μπαίνω στο phpmyadmin για να δώ τον πίνακα οι ελληνικές λέξεις είναι σωστές. Δηλαδή ΑΝΘΡΩΠΟΣ,ΣΚΥΛΟΣ κτλ.

Το πρόβλημα είναι όταν πάω να εκτελέσω ένα query του τύπου:

Κώδικας: Επιλογή όλων

SELECT * FROM words WHERE word='ΣΚΥΛΟΣ';
Τότε μου βγάζει 0 records σαν αποτέλεσμα είτε το select το γράψω στο phpmyadmin είτε σε php script.

Έχω δοκιμάσει να θέσω

Κώδικας: Επιλογή όλων

character_set_filesystem = utf8
character_set_server = utf8
στο my.ini και μετά επανεκκίνηση της mysql αλλά τίποτα.
Επίσης έκανα export την βάση σε αρχείο .sql και όταν το άνοιξα τα εμφάνιζε αλαμπουρνέζικα (οπότε πιθανόν κατά το load δεν ανεβαίνουν με σωστή κωδικοποίηση. Αλλά γιατί στο phpmyadmin τα διαβάζω σωστά??)
Τέλος όταν κάνω insert με το κλασικό τρόπο και όχι από αρχείο δεν υπάρχει κανένα πρόβλημα. Το θέμα μου είναι ότι δεν είναι εύκολο να κάνω insert με τον κλασικό τρόπο γιατί θέλω να φορτώσω 350.000 εγγραφές στη βάση. Μήπως η load data έχει κανένα bug?

Ευχαριστώ εκ των προτέρων και άν χρειάζονται παραπάνω πληροφορίες πείτε μου για να τις επισυνάψω

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Πρόβλημα με ελληνικούς χαρακτήρες στην εντολή LOAD DATA INFILE

Δημοσίευση από Apostolis_38 » 03 Φεβ 2013 11:25

Χρησιμοποίησε και στο select το set names utf8.

Aν βάλεις στο query

Κώδικας: Επιλογή όλων

WHERE word LIKE '%"ΣΚΥΛΟΣ"%'
φέρνει την εγγραφή;
Δοκίμασέ το να δούμε.

omerta22
Δημοσιεύσεις: 6
Εγγραφή: 21 Φεβ 2008 02:54

Πρόβλημα με ελληνικούς χαρακτήρες στην εντολή LOAD DATA INFILE

Δημοσίευση από omerta22 » 03 Φεβ 2013 12:55

Τι εννοείς όταν λες να βάλω το set name 'utf8' στο select?
Η εντολή mysql_query("SET NAMES 'utf8'",$link) δεν θα ισχύσει για όλα τα queries της σύνδεσης link?

Το άλλο που μου είπες το έκανα αλλά δεν λειτουργεί.
Εάν όμως αντί για

Κώδικας: Επιλογή όλων

WHERE word LIKE '%"ΣΚΥΛΟΣ"%'
βάλω

Κώδικας: Επιλογή όλων

WHERE word LIKE '%ΣΚΥΛΟΣ%'
μου επιστρέφει αποτέλεσμα αλλά όχι ένα αποτέλεσμα
πχ μου επιστρέφει τη λέξη σκύλος και την λέξη καραβόσκυλος

Η πρώτη ερώτηση είναι γιατί λειτουργεί η select με το LIKE και όχι με απλό =?
Εάν θέσω

Κώδικας: Επιλογή όλων

WHERE word LIKE '%ΣΚΥΛΟΣ'
δεν εμφανίζει αποτελέσματα. Δε θα έπρεπε να εμφανίζει πχ καραβόσκυλος?
Το παρακάτω επίσης δεν δουλεύει:

Κώδικας: Επιλογή όλων

WHERE word LIKE '[ΑΒΓ]%'
δεν εμφανίζει όλες τις λέξεις που αρχίζουν από Α, Β, Γ
Επίσης δοκίμασα και το

Κώδικας: Επιλογή όλων

WHERE word ΒΕΤWΕΕΝ 'ΣΚΥΛΟΣ' AND 'ΠΕΤΡΑ'
και λειτούργησε (μου εμφάνισε όλες τις λέξεις μεταξύ σκύλος και πέτρα)

Η δεύτερη ερώτηση είναι πως μπορώ να κάνω query που να εμφανίζει ακριβώς μία εγγραφή? δηλαδή στο παράδειγμα μου μόνο τη λέξη σκύλος και όχι τη λέξη καραβόσκυλος

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Πρόβλημα με ελληνικούς χαρακτήρες στην εντολή LOAD DATA INFILE

Δημοσίευση από Apostolis_38 » 03 Φεβ 2013 13:10

Δεν γνωρίζω πως χρησιμοποιείς το set names οπότε δεν μπορώ να σου πω αν θα έπρεπε να τρέχει συνέχεια ή όχι.
Αν το έχεις σε ένα script το οποίο καλείς σε κάθε σύνδεση με τη βάση ναι. Αλλιώς όχι, θα πρέπει να το βάζεις σε κάθε ένα query που τρέχεις.
Εγώ για παράδειςγμα χρησιμοποιώ τον πρώτο τρόπο.

Το LIKE ψάχνει και βρίσκει όλες τις λέξεις που περιέχουν τα γράμματα που δίνεις, Το = ψάχνει ακριβώς το string.
Αν βάλεις και το % ενέχει ρόλο wild charachter. Γι αυτό σου φέρνει και "άσχετες" λέξεις.
Αρα λοιπόν αφού στο φέρνει σημαίνει οτι η λέξη έχει καταχωρηθεί διαφορετικά στη βάση.
Με κενά πρίν και μετά τη λέξη;
Με κάποιο διαφορετικό γράμμα (π.χ. Αγγλικό Ο αντί για Ελληνικό);
Δεν γνωρίζω. Πρέπει να το ψάξεις.

Υ.Γ. μην χρησιμοποιείς ακριβώς τα παραδείγματα που σου βάζω αλλά ψάξτο λίγο όπως με το '%ΣΚΥΛΟΣ%' αντί για '%"ΣΚΥΛΟΣ"%'
Δεν μπορώ να ξέρω τι ακριβώς θα παίξει στο script σου.
Απλώς μια ιδέα σου δίνω.

omerta22
Δημοσιεύσεις: 6
Εγγραφή: 21 Φεβ 2008 02:54

Πρόβλημα με ελληνικούς χαρακτήρες στην εντολή LOAD DATA INFILE

Δημοσίευση από omerta22 » 03 Φεβ 2013 14:02

Κατ' αρχάς ευχαριστώ για τις απαντήσεις.
Και εγώ τον πρώτο τρόπο χρησιμοποιώ οπότε δεν είναι αυτό.

Επίσης
Αρα λοιπόν αφού στο φέρνει σημαίνει οτι η λέξη έχει καταχωρηθεί διαφορετικά στη βάση.
γιατί συμβαίνει αυτό αφού το '%ΣΚΥΛΟΣ%' το έχω με ελληνικούς χαρακτήρες οπότε αφού μου επιστρέφει σημαίνει ότι το ΣΚΥΛΟΣ έχει καταχωρηθεί με ελληνικούς χαρακτήρες στη βάση. Ή κάνω λάθος? Με το '=' γιατί δεν επιστρέφει τίποτα δεν καταλαβαίνω. και γιατί με κάποια wildcards επίσης δεν επιστρέφει τίποτα πάλι δεν καταλαβαίνω.

Και πάλι ευχαριστώ για το χρόνο που διαθέτεις

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Πρόβλημα με ελληνικούς χαρακτήρες στην εντολή LOAD DATA INFILE

Δημοσίευση από Apostolis_38 » 03 Φεβ 2013 17:45

Εφόσον υπάρχουν wildcards δεν ξέρω τι μπορεί να βρίσκει και να σου επιστρέφει και τι όχι.
Για παράδειγμα, αυτό

Κώδικας: Επιλογή όλων

WHERE word LIKE '%"ΣΚΥΛΟΣ"%'
μπορεί να βρίσκει κενὸ στο τέλος,ενώ το

Κώδικας: Επιλογή όλων

WHERE word LIKE '%"ΣΚΥΛΟΣ"'
όχι.

Επεξεργάσου τη λέξη με το phpmyadmin και κοίτα να δεις πότε στη φέρνει και πότε όχι.

omerta22
Δημοσιεύσεις: 6
Εγγραφή: 21 Φεβ 2008 02:54

Πρόβλημα με ελληνικούς χαρακτήρες στην εντολή LOAD DATA INFILE

Δημοσίευση από omerta22 » 09 Φεβ 2013 17:07

Το πρόβλημα μου λύθηκε!
Δεν υπήρχε πρόβλημα στην κωδικοποίηση τελικά!
Ούτε στο αρχειο, ούτε στην εντολή.
Το πρόβλημα ήταν ότι το αρχείο .csv ήταν μεν της μορφής

Κώδικας: Επιλογή όλων

null,ΣΚΥΛΟΣ
null,ΑΝΘΡΩΠΟΣ
αλλά υπήρχαν κρυφοί χαρακτήρες που δεν είχα ανακαλύψει! Δηλαδή το αρχείο είχε την μορφή:

Κώδικας: Επιλογή όλων

null,ΣΚΥΛΟΣ\r\n
null,ΑΝΘΡΩΠΟΣ\r\n
με αποτέλεσμα να περνάω μαζί με τη λέξη και τον κρυφό χαρακτήρα \r.
Γι' αυτό και τα λάθη στο query!
Άλλαξα το script:

Κώδικας: Επιλογή όλων

mysql_query("SET NAMES 'utf8'",$link)
mysql_query("LOAD DATA INFILE 'my_file.csv' INTO TABLE words
CHARACTER SET utf8
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n\r';");
και όλα μια χαρά.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Πρόβλημα με ελληνικούς χαρακτήρες στην εντολή LOAD DATA INFILE

Δημοσίευση από dva_dev » 09 Φεβ 2013 20:15

Οταν παίρνεις ένα αρχείο πρέπει να εξετάζεις από τι σύστημα παράχθηκε.
Αυτός ο "κρυφός" χαρακτήρας είναι το μισό από την αλλαγή γραμμής στα windows.
Αν έπαιρνες το αρχείο αυτό από κάποιο osx θα είχες μόνο το \r και καθόλου \n.
Αν έπαιρνες το αρχείο από linux θα είχες μόνο \n και καθόλου \r.

Δεν μας είπες πως το βρήκες ότι ήταν εκεί το πρόβλημα.

omerta22
Δημοσιεύσεις: 6
Εγγραφή: 21 Φεβ 2008 02:54

Πρόβλημα με ελληνικούς χαρακτήρες στην εντολή LOAD DATA INFILE

Δημοσίευση από omerta22 » 10 Φεβ 2013 14:49

Τα στοιχεία τα είχα πάρει από internet και τα είχα βάλει στο excel. Έκανα κάποιες μετατροπές και αποθήκευση σαν csv. Λειτουργικό Windows έχω. Τώρα διάβασα ότι τα windows για line separator χρησιμοποιούν \r\n ενώ τα unix \n. Δικό μου το λάθος αλλά δεν είχα σκεφτεί ότι το πρόβλημα θα ήταν σε κρυφούς χαρακτήρες. Είχα επικεντρωθεί στην κωδικοποίηση.

Απάντηση

Επιστροφή στο “MySQL”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες