nikS Δημοσ. 30 Μαΐου 2014 Δημοσ. 30 Μαΐου 2014 Γεια σας, δημιουργώ ένα view σε mysql το οποίο βασίζεται σε μια κολόνα ενός πίνακα τύπου char(1). Οι τιμές που παίρνει είναι ένας ελληνικός χαρακτήρας (πχ 'M', 'Υ' κλπ). Η δημιουργία του view είναι η εξής: create view v_diacan asselect fmemcode, fcomp, fcompanyfrom diacanwhere fserv='Μ'; Το view δημιουργείται αλλά δεν περιέχει καθόλου data (0 rows). Το περίεργο είναι ότι όταν τρέξω μόνο του το query select fmemcode, fcomp, fcompanyfrom diacanwhere fserv='Μ'; φέρνει κανονικά τις εγγραφές. Σκέφτηκα ότι θα φταίει το collation της βάσης που ήταν greek_general_ci. Το άλλαξα όμως σε utf8_general_ci και πάλι το ίδιο κάνει. Σας έχει τύχει κάτι τέτοιο ή έχει κάποιος καμμιά ιδέα πριν το βγάλω έξω ως bug; Γιατί κάτι τέτοιο μου μυρίζει απ' τη στιγμή που το select παίζει σωστά και το view το οποίο βασίζεται στο ίδιο select, δεν παίζει.
defacer Δημοσ. 30 Μαΐου 2014 Δημοσ. 30 Μαΐου 2014 Προφανώς είτε το input σου όταν πας να δημιουργήσεις view μεταφράζεται διαφορετικά από το όταν πας να τρέξεις το query (γιατί? εσύ μόνο μπορείς να ξέρεις), είτε στη μία περίπτωση βάζεις λατινικό M ενώ στην άλλη ελληνικό. Η περίπτωση του bug βέβαια δε μπορεί να αποκλειστεί μαθηματικά, αλλά select isn't broken.
nikS Δημοσ. 30 Μαΐου 2014 Μέλος Δημοσ. 30 Μαΐου 2014 Προφανώς είτε το input σου όταν πας να δημιουργήσεις view μεταφράζεται διαφορετικά από το όταν πας να τρέξεις το query (γιατί? εσύ μόνο μπορείς να ξέρεις), είτε στη μία περίπτωση βάζεις λατινικό M ενώ στην άλλη ελληνικό. Η περίπτωση του bug βέβαια δε μπορεί να αποκλειστεί μαθηματικά, αλλά select isn't broken. Προφανώς,,, Κι αν το ήξερα δε θα ρωτούσα. Πάντως το να βάζω στη μια λατινικό και στην άλλη ελληνικό αποκλείεται από τη στιγμή που έχει ανακαλυφθεί το copy-paste. Θα με βοηθούσε πάντως κάποιος αν έκανε reproduce το issue στο δικό του περιβάλλον και μου έλεγε αν κάνει και σ' αυτόν το ίδιο. Να προσθέσω εδώ ότι η db είναι στημένη σε linux.
defacer Δημοσ. 30 Μαΐου 2014 Δημοσ. 30 Μαΐου 2014 Καλό το copy paste, αλλά το θέμα είναι πως δεν έχουμε την παραμικρή ιδέα για το ποιός είσαι, πόσο νιώθεις, αν εκείνη την ώρα σκεφτόσουν μια παραλία στη Χαβάη, αν δε θυμάσαι ξεκάθαρα πως έκανες copy paste (το μυαλό συχνά παίζει παιχνίδια) και το λες γιατί "προφανώς έκανα copy paste τι άλλο μπορεί να είχα κάνει", κλπ κλπ κλπ. Εδώ υπάρχουν τρεις περιπτώσεις: έχεις κάνει κάποιο χαζό λάθος κάτι σου διαφεύγει η MySql έχει bug Εφόσον το δεύτερο είναι πολύ δύσκολο να διαγνωστεί γιατί δε μας δίνεις και πολλά to work with (και ειλικρινά πιστεύω πως εκεί που το αφήνεις δεν πρόκειται να διαγνωστεί από άλλον) και το τρίτο είναι πολύ απίθανο, έκανα το μόνο πράγμα που μπορούσε να έχει πρακτικό αποτέλεσμα χωρίς να χρειάζεται ιστορίες για αγρίους: σου είπα να ελέγξεις το πρώτο. Nothing personal eh?
nikS Δημοσ. 30 Μαΐου 2014 Μέλος Δημοσ. 30 Μαΐου 2014 Ας συστηθώ λοιπόν ως κάποιος με μεγάλη εμπειρία σε sql και rdbms's και ειδικότερα σε ingres db.Σε mysql τώρα ξεκινάω και προσπαθώ να μεταφέρω μια βάση από ingres.Έκανα reproduce το case δουλεύοντας εξ' ολοκλήρου από έναν mysql client μέσω windows (και όχι από putty όπως είχα κάνει πριν) για να είμαι σίγουρος ότι δε συμβαίνει κάποιο περίεργο λάθος με την κωδικοποίηση. Για όποιον θέλει να το δοκιμάσει και να το δει, παραθέτω και τα βήματα. 1) Δημιουργώ μια καινούργια βάση με collation utf8_unicode_ci. Μέσα σ' αυτήν δημιουργώ έναν πίνακα ως εξής: CREATE TABLE `diacan2` (`fmemcode` CHAR(12) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',`fc` CHAR(1) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci')COMMENT='Test table'COLLATE='utf8_unicode_ci'ENGINE=InnoDB; Εισάγω 2 rows ως εξής insert into diacan2 values ('Μ12345678901', 'Γ'); /*Χρησιμοποίησα το γράμμα 'Γ' για να είμαστε όλοι σίγουροι ότι είναι αυτό*/ insert into diacan2 values ('Μ23456789012', 'Υ'); Στη συνέχεια τρέχω ένα απλό select fmemcode from diacan2 where fc='Γ'; Φέρνει 1 row. Μετά δημιουργώ το view create view v_diacan2 as select fmemcode from diacan2 where fc='Γ';; commit; select * from v_diacan2; NO ROWS!!!! Το ίδιο τεστ το έκανα με λατινικούς χαρακτήρες στο πεδίο fc και δουλεύει μια χαρά. Η mysql server version μου γράφει ότι είναι η 5.6.16. 1
nikS Δημοσ. 30 Μαΐου 2014 Μέλος Δημοσ. 30 Μαΐου 2014 Σε MySQL 5.1.41 που έχω εύκαιρο, δουλεύει σωστά. Δοκίμασες το παράδειγμά μου?
Noobie Δημοσ. 30 Μαΐου 2014 Δημοσ. 30 Μαΐου 2014 Και εγώ το δοκίμασα σε MySQL 5.5.37 και δουλεύει μια χαρά.
StathisG Δημοσ. 31 Μαΐου 2014 Δημοσ. 31 Μαΐου 2014 Δοκίμασες το παράδειγμά μου? Ε, ναι, σε τι να αναφερόμουν πως "δουλεύει σωστά";
nikS Δημοσ. 31 Μαΐου 2014 Μέλος Δημοσ. 31 Μαΐου 2014 Τι να πω? Κάτι πρέπει να μου διαφεύγει τότε. Το να έχει bug η μεταγενέστερη version που χρησιμοποιώ δεν μπορεί να αποκλειστεί αλλά μάλλον δεν είναι το πιο πιθανό σενάριο
geomagas Δημοσ. 31 Μαΐου 2014 Δημοσ. 31 Μαΐου 2014 Και σε μένα δούλεψε (5.5.37). Παρακαλούσα να μην δουλέψει όμως, για να δοκιμάσω τη διαφορά αν: α) άλλαζα τα collations σε utf8_general_ci (αυτό είναι που χρησιμοποιώ εγώ πάντα) β) όριζα τη view ως create view v_diacan2 as select fmemcode from diacan2 και μετά έκανα select * from v_diacan2 where fc='Γ' (δηλαδή το 'Γ' δεν το αποθήκευα στο view definition). Αν βρεις το χρόνο να τα δοκιμάσεις, προσωπικά έχω την περιέργεια να μάθω.
nikS Δημοσ. 31 Μαΐου 2014 Μέλος Δημοσ. 31 Μαΐου 2014 Και σε μένα δούλεψε (5.5.37). Παρακαλούσα να μην δουλέψει όμως, για να δοκιμάσω τη διαφορά αν: α) άλλαζα τα collations σε utf8_general_ci (αυτό είναι που χρησιμοποιώ εγώ πάντα) β) όριζα τη view ως create view v_diacan2 as select fmemcode from diacan2 και μετά έκανα select * from v_diacan2 where fc='Γ' (δηλαδή το 'Γ' δεν το αποθήκευα στο view definition). Αν βρεις το χρόνο να τα δοκιμάσεις, προσωπικά έχω την περιέργεια να μάθω. Προφανώς στο view που έφτιαξες συμπεριέλαβες και το fc (select fmemcode, fc from diacan...) γιατι διαφορετικά δε θα μπορούσες να τρέξεις το where clause (where fc='Γ') από το view. Φυσικά κι αν δε βάλω το fc='Γ' στο view definition μου δουλεύει. Και στην τελική, αυτό θα κάνω κι όταν το χρησιμοποιήσω θα βάλω απλά μια επιπλέον συνθήκη στο query. Βέβαια το πραγματικό query δεν είναι τόσο από (έχει join από 2 πίνακες και αρκετά άλλα στο where clause). Αλλιώς δε θα είχε νόημα να έχω ένα τέτοιο view. Απλά το υπεραπλούστευα για να απομονώσω το πρόβλημα. Σ' ευχαριστώ για το χρόνο σου.
geomagas Δημοσ. 31 Μαΐου 2014 Δημοσ. 31 Μαΐου 2014 Προφανώς στο view που έφτιαξες συμπεριέλαβες και το fc (select fmemcode, fc from diacan...) γιατι διαφορετικά δε θα μπορούσες να τρέξεις το where clause (where fc='Γ') από το view. Ναι σωστά. Δεν το έφτιαξα όμως. Απλά μία ιδέα ήταν, που δεν μπορούσα να τη δοκιμάσω, διότι όπως είπα σε μένα δούλευε το original. Φυσικά κι αν δε βάλω το fc='Γ' στο view definition μου δουλεύει. Άρα φταίει ο τρόπος που αποθηκεύεται το view definition στη βάση. Βέβαια το πραγματικό query δεν είναι τόσο από (έχει join από 2 πίνακες και αρκετά άλλα στο where clause). Αλλιώς δε θα είχε νόημα να έχω ένα τέτοιο view. Απλά το υπεραπλούστευα για να απομονώσω το πρόβλημα. Ναι προφανώς. Με utf8_general_ci έχει την ίδια συμπεριφορά;
nikS Δημοσ. 31 Μαΐου 2014 Μέλος Δημοσ. 31 Μαΐου 2014 Με utf8_general_ci δουλεύει κανονικά!!! Κάνω μερικά ακόμη τεστ και επιστρέφω με το συμπέρασμα (αν καταλάβω τι γίνεται)
nikS Δημοσ. 31 Μαΐου 2014 Μέλος Δημοσ. 31 Μαΐου 2014 Προσπάθησα να το τρέξω, τη μία με utf8_unicode_ci και την άλλη με utf8_general_ci. Στη μία περίπτωση δημιουργώ ένα diacan2 και ένα view v_diacan2. Στη 2η αντίστοιχα ένα diacan3 και ένα view v_diacan3. Τρέχω στην 1η περίπτωση τα εξής: CREATE TABLE `diacan2` (`fmemcode` CHAR(12) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',`fc` CHAR(1) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci')COMMENT='Test table'COLLATE='utf8_unicode_ci'ENGINE=InnoDB;insert into diacan2values ('Μ12345678901', 'Γ');insert into diacan2values ('Μ23456789012', 'Υ');create view v_diacan2 asselect fmemcode from diacan2 where fc='Γ';commit; Στη 2η τρέχω αντίστοιχα: CREATE TABLE `diacan3` (`fmemcode` CHAR(12) NOT NULL DEFAULT '' COLLATE 'utf8_general_ci',`fc` CHAR(1) NOT NULL DEFAULT '' COLLATE 'utf8_general_ci')COMMENT='Test table'COLLATE='utf8_general_ci'ENGINE=InnoDB;insert into diacan3values ('Μ12345678901', 'Γ');insert into diacan3values ('Μ23456789012', 'Υ');create view v_diacan3 asselect fmemcode from diacan3 where fc='Γ';commit; Βλέπω λοιπόν ότι το view τώρα δουλεύει και στις 2 περιπτώσεις Μετά τσεκάρω το collation σε πίνακα και view (δεν ξέρω αν στο view έχει νόημα) show create table diacan2; CREATE TABLE `diacan2` ( `fmemcode` char(12) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', `fc` char(1) COLLATE utf8_unicode_ci NOT NULL DEFAULT '') ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Test table' show create table diacan3; CREATE TABLE `diacan3` (`fmemcode` char(12) NOT NULL DEFAULT '',`fc` char(1) NOT NULL DEFAULT '') ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Test table' Όπως παρατηρείτε, στο diacan3 δε μου δείχνει collation (αλλά δεν ξέρω αν έχει κι αυτό κανένα νόημα). Το "Show create view" μου δείχνει και για τα 2 view το ίδιο πράγμα: character_set_client = 'utf8' και collation_connection='utf8_general_ci' (δε θα έπρεπε να δείχνει στην 1η περίπτωση utf8_unicode_ci?) Εν ολίγοις, τώρα δουλεύει και στις 2 περιπτώσεις. Δεν ξέρω τι έφταιγε πριν. Οπότε δε θα το ψάξω άλλο.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα