Θέμα με τονισμένα φωνήεντα σε query

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

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

Απάντηση
Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

Θέμα με τονισμένα φωνήεντα σε query

Δημοσίευση από jpk » 12 Σεπ 2013 20:24

dev το δοκίμασες πριν το πεις ; ;OXI … dva_dev και οι υπόλοιποι προσπαθήστε να επαναλάβετε το λάθος. Έχει πολύ ενδιαφέρον.

Έτσι είναι όπως τα λέει, ένα αρχείο PHP που έχει αποθηκευθεί ISO-8859-7 χωρίς να θέτει character names σε βάση , και μόνο κάνοντας iconv('', "ISO-8859-7", $name) όταν σώζει αυτά θα πάρει. Εχτές έφαγα καμία ώρα να καταλάβω τι λέει γιατί και εγώ έχω δουλέψει σε δουλειά που δεν ευθυνόμουν για το σύστημα.

Συμπερασματικά …. Αργήσαμε .. (να μην σας πω τι κάναμε παλιότερα) .. .Αλλά το web έχει επιτέλους κωδικοποίηση και αυτή είναι UTF-8 … όποιος θέλει άλλα encodings (κωδικοποιήσεις χαρακτήρων) αυτά και άλλα θα παθαίνει.

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

Θέμα με τονισμένα φωνήεντα σε query

Δημοσίευση από dva_dev » 12 Σεπ 2013 23:35

Η δοκιμή που είχα κάνει είναι αυτή:

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

mysql> set names utf8;

mysql> create table t (
    -> id int not null auto_increment,
    -> col1 varchar(64) charset utf8,
    -> col2 varchar(64) charset greek,
    -> col3 varchar(64) charset latin1,
    -> primary key(id)
    -> );

mysql> insert into t(col1) values ('Πάρος'),('Πόρος');

mysql> update t set col2=col1;

mysql> update t set col3=convert(col2 using binary);

mysql> select * from t;
+----+------------+------------+------------+
| id | col1       | col2       | col3       |
+----+------------+------------+------------+
|  1 | Πάρος | Πάρος | ÐÜñïò |
|  2 | Πόρος | Πόρος | Ðüñïò |
+----+------------+------------+------------+

mysql> select hex(col1), hex(col2), hex(col3) from t;
+----------------------+------------+------------+
| hex(col1)            | hex(col2)  | hex(col3)  |
+----------------------+------------+------------+
| CEA0CEACCF81CEBFCF82 | D0DCF1EFF2 | D0DCF1EFF2 |
| CEA0CF8CCF81CEBFCF82 | D0FCF1EFF2 | D0FCF1EFF2 |
+----------------------+------------+------------+

mysql> create view t1 as select * from t where id=1;

mysql> create view t2 as select * from t where id=2;

mysql> select * from t1, t2 where t1.col1=t2.col1;
Empty set (0.02 sec)

mysql> select * from t1, t2 where t1.col2=t2.col2;
Empty set (0.02 sec)

mysql> select * from t1, t2 where t1.col3=t2.col3;
+----+------------+------------+------------+----+------------+------------+------------+
| id | col1       | col2       | col3       | id | col1       | col2       | col3       |
+----+------------+------------+------------+----+------------+------------+------------+
|  1 | Πάρος | Πάρος | ÐÜñïò |  2 | Πόρος | Πόρος | Ðüñïò |
+----+------------+------------+------------+----+------------+------------+------------+
Παρόλα αυτά ένα "show create database xxx" και ένα "show create table xxx" μπορεί να ξεδιαλύνει αρχικά τι γίνεται στη βάση, και για να δούμε τι έχει αποθηκευτεί στη βάση νομίζω πως αρκεί ένα "select hex(field) from table".
Μετά μπορούμε να πάμε στην php.

nbc
Honorary Member
Δημοσιεύσεις: 526
Εγγραφή: 05 Σεπ 2009 20:12
Επικοινωνία:

Θέμα με τονισμένα φωνήεντα σε query

Δημοσίευση από nbc » 13 Σεπ 2013 00:33

Η συντριπτική πλειοψηφία των ελληνικών εγκαταστάσεων vBulletin, έχουν τις εξής ρυθμίσεις:

- latin1_swedish_ci στη βάση
- ISO-8859-7 ως meta header
- ΟΧΙ SET NAMES

Η μισή ντροπή είναι της vBulletin, και η άλλη μισή των εγκαταστατών. Με την έννοια του ότι υπάρχουν οι σχετικές ρυθμίσεις στο config της, και αν κάποιος μπει στον κόπο να το μελετήσει μέχρι τέλους (και με την προϋπόθεση πως έχει σετάρει σωστά τη βάση), τότε έχει και σωστή κωδικοποίηση απ' άκρη σ' άκρη.

Τέλος πάντων, σχετικά με την απορία του philos, το θέμα εξηγείται ως εξής:

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

Πάρος ά 0xDC κεφαλαίο U με διαίρεση
Πόρος ό 0xFC πεζό     u με διαίρεση
Μύλος ύ 0xDE κεφαλαίο thorn
Μώλος ώ 0xFE πεζό     thorn
Δηλαδή, με βάση τα δεδομένα που η MySQL *νομίζει* πως έχει (latin1), είναι συνεπής με αυτό που είναι προγραμματισμένη να κάνει.

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Θέμα με τονισμένα φωνήεντα σε query

Δημοσίευση από geomagas » 13 Σεπ 2013 00:55

Μπάχαλο...

- Η ιστοσελίδα σε windows-1253.
- Η ΒΔ σε utf8, και ο εν λόγω πίνακας το ίδιο, αλλά άλλοι πίνακες όχι (βλ screenshots).
- Κάποια πεδία ενδεχομένως να έχουν παραμείνει σε άσχετες κωδικοποιήσεις, παρά την αλλαγή στο collation της ΒΔ και του πίνακα
- Τα δεδομένα, πριν αποθηκευθούν, μετατρέπονται από windows-1253 σε iso-8859-7, αλλά ίσως όχι για όλους τους πίνακες/πεδία.

Τι μπορείς να κάνεις για να τα κάνεις όλα αυτά να συμφωνήσουν; Και επιπλέον, αποφεύγοντας να σκορπίσεις άπειρες iconv σε όλο το φάσμα του κώδικα;

Εγώ θα έστηνα από την αρχή τη ΒΔ. Αυτή η Βαβέλ που επικρατεί εκεί μέσα είναι ωρολογιακή βόμβα. Και θα φρόντιζα να τη ρυθμίσω εξ αρχής σε collation συμβατό με windows-1253.

Έχουμε πάντως ένα πρόβλημα: Η MySQL δεν υποστηρίζει windows-1253 αλλά μόνο ISO-8859-7 (=greek_general_ci), που υποτίθεται ότι είναι το πλησιέστερο. Δεν είναι όμως ακριβώς το ίδιο.

Υπάρχει όμως και αυτό (DISCLAIMER: Δεν το έχω δοκιμάσει σε production!)

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

Θέμα με τονισμένα φωνήεντα σε query

Δημοσίευση από dva_dev » 13 Σεπ 2013 00:56

για να διορθωθεί αυτό το χάλι θα έλεγα ότι θέλει η βάση αρχικά binary conversion από Latin1 σε Greek μετά conversion σε utf8 και αλλαγή των ρυθμίσεων σε utf8 στην ιστοσελίδα.
Όπως περιέγραψα και πριν για να διορθώσουμε το χάλι της βάσης (το col3 βασικά που είναι latin1) κάνουμε τα εξής:

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

mysql> alter table t modify col3 varchar(64) charset binary;

mysql> alter table t modify col3 varchar(64) charset greek;

mysql> alter table t modify col3 varchar(64) charset utf8 collate utf8_general_ci;

mysql> select * from t;
+----+------------+------------+------------+
| id | col1       | col2       | col3       |
+----+------------+------------+------------+
|  1 | Πάρος | Πάρος | Πάρος |
|  2 | Πόρος | Πόρος | Πόρος |
+----+------------+------------+------------+

mysql> select * from t1, t2 where t1.col3=t2.col3;
Empty set (0.02 sec)
Και τώρα που η βάση ήρθε στα ίσια της μπορούμε να ασχοληθούμε και με την ιστοσελίδα.

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

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

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