Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Νέα βάση με ελληνική κωδικοποίηση UTF-8

Îåêßíçóå áðü ôï ìÝëïò dtakis. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 03-11-2009, 17:44. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  02-11-2009, 13:25 54894

    Νέα βάση με ελληνική κωδικοποίηση UTF-8

    Τι charset να επιλέξω αν θέλω να αποθηκεύω ελληνικά σε UTF-8 στον SQL Server και να τα βλέπω ελληνικά από το SMSS;

    Greek_bin ;

  •  02-11-2009, 13:57 54895 σε απάντηση της 54894

    Απ: Νέα βάση με ελληνική κωδικοποίηση UTF-8

    Ο SQL Server δεν χρειάζεται καμμία ιδιαίτερη ρύθμιση για να αποθηκεύσει/επιστρέψει ελληνικά. Από τη στιγμή που χρησιμοποιείς nvarchar columns τα δεδομένα αποθηκεύονται σε μορφή Unicode. Αν έχεις πρόβλημα στην παρουσίαση των ελληνικών αυτό οφείλεται κατά πάσα πιθανότητα στην εφαρμογή σου. Επίσης, προβλήματα εμφανίζονται αν χρησιμοποιήσεις varchar πεδία με λάθος collation, π.χ. φτιάξεις μία βάση με ελληνικό collation και προσπαθήσεις να διαβάσεις δεδομένα σε αγγλικό ή ρουμάνικο codepage.

    Ρίξε μία ματιά και στο "Ο SQL Server ΔΕΝ ΧΡΕΙΑΖΕΤΑΙ ΚΟΛΠΑ για να υποστηρίξει ελληνικά" για μία πιο αναλυτική απάντηση. Η ερώτηση "πως θα δείξω ελληνικά στον SQL Server" έχει γίνει δεκάδες φορές και η απάντηση είναι πάντα "έχει πρόβλημα η εφαρμογή σου".


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-11-2009, 14:50 54896 σε απάντηση της 54895

    Απ: Νέα βάση με ελληνική κωδικοποίηση UTF-8

    Το θέμα μου εδώ είναι το αντίστροφο απλώς μέχρι τώρα ποτέ δεν με έχει απασχολήσει. Ας ξεχάσουμε την ύπαρξη οποιασδήποτε εφαρμογής (η οποία δείχνει ελληνικά κανονικά πάντα).

    Το Management Studio του Sql Server πως μπορεί να προβάλλει το UTF-8 encoding κανονικά και όχι ως Στον Οδηγό... ;

    Τα ίδια δεδομένα τα εμφανίζει ελληνικά μια προβολή χωρίς κάποιο convertion με κωδικοποίηση σελίδα UTF-8

    Μοιάζει σαν νά τα προβάλλει το Management Studio ως ISO-8859-7. Μήπως θέλει αυτό κάποια ρύθμιση για την σωστή προβολή; Το τι charset από τα Greek_ επιλέξω δεν παίζει κάποιο ρόλο;

    Το θέμα δεν είναι η εφαρμογή επαναλαμβάνω από την πλευρά προβολής των δεδομένων από οποιαδήποτε εφαρμογή σε .NET/PHP είναι οκ.

     

    Thanx για το blog post (εννοείται πως το πρώτο ερώτημα είναι το πιο σύνηθες αλλά ευτυχώς δεν έπεσα σε αυτή την περίπτωση από την αρχή)!

  •  02-11-2009, 17:34 54900 σε απάντηση της 54896

    Απ: Νέα βάση με ελληνική κωδικοποίηση UTF-8

    Να επαναλάβω, ότι δεν υπάρχει θέμα Unicode στον SQL Server ούτε στο .NET Τα strings του .NET είναι ΠΑΝΤΑ Unicode. Ό,τι αποθηκεύεται σε πεδίο nvarchar είναι εξ ορισμού Unicode. Unicode σημαίνει 2 bytes ανά γράμμα. Αν θέλεις, ο SQL Server χρησιμοποιεί UTF16 και πιο συγκεκριμένα το υποσύνολο UCS2. Το UTF8 από την άλλη χρησιμοποιεί 1 byte για λατινικούς και 2-3 bytes για άλλους χαρακτήρες. Οι τύποι nchar, nvarchar, ntext χρησιμοποιούνε 2 bytes για να αποθηκεύσουν ό,τι τους δώσεις ως Unicode. O SQL Server δεν υποστηρίζει UTF8 οπότε ό,τι προσπαθήσεις να αποθηκεύσεις σε αυτή τη μορφή θα βγει περίεργο (και για το επίσημο του θέματος, δες το Description of Storing UTF8 data in SQL Server). Ο λόγος που αυτό δεν είναι θέμα σε περιβάλλον Windows είναι ότι τόσο το λειτουργικό όσο και οι γλώσσες (C++, .NET, ακόμα και VΒ6) χρησιμοποιούνε πάντα UTF16.

    Αν αυτό που τους δώσεις είναι Unicode θα αποθηκευθεί ως έχει. Επιπλέον, το Management Studio χρησιμοποιεί Unicode γραμματοσειρές out-of-the-box οπότε δεν υπάρχει θέμα να σου δείξει λάθος τους Unicode χαρακτήρες. Αν βλέπεις περίεργους χαρακτήρες ή δεν δουλεύεις με nvarchar ή αποθήκευσες χαλασμένα δεδομένα σε nvarchar πεδίο.

    Υποψιάζομαι ότι προσπάθησες να αποθηκεύσεις UTF8 χαρακτήρες είτε σε nvarchar είτε σε varchar πεδίο. Επίσης υποψιάζομαι ότι η βιβλιοθήκη που χρησιμοποίησες για την αποθήκευση ή δεν καταλαβαίνει από μετατροπές μεταξύ codepage ή έκανε λάθος μετατροπή. Για παράδειγμα, το OLEDB και το ADO.NET λαμβάνουν υπόψη το codepage τόσο του server όσο και του client για να μετατρέψoyn non-unicode χαρακτήρες στην αντίστοιχη unicode μορφή όταν εκτελείς ένα statement με παραμέτρους, αλλά και να σου επιστρέψουν τα strings στο σωστό codepage αν η εφαρμογή δεν καταλαβαίνει από Unicode. Άλλες βιβλιοθήκες δεν κάνουν σωστά τις μετατροπές των codepages.

    Για παράδειγμα,  η PHP δεν καταλαβαίνει καν από παραμέτρους οπότε και δεν μπορεί να κάνει καμμία μετατροπή. Για να αποθηκεύσεις σωστά unicode δεδομένα μέσω PHP θα πρέπει να φτιάξεις το σωστό statement, π.χ INSERT INTO MY TABLE (Col1, Col2) VALUES (1, Ν'Το κείμενο μου'). Το έντονο N σημαίνει ότι αυτό που ακολουθεί θα πρέπει να μεταφραστεί ως Unicode. Και φυσικά, για να μεταφραστεί αυτό που ακολουθεί ως Unicode θα πρέπει να ΕΙΝΑΙ Unicode. Αν π.χ. σώσεις το source code σου με ρουμανικό codepage, μην περιμένεις να καταλάβει ο SQL Server ότι εννοούσες να δώσεις ελληνική τιμή. Όταν γίνει compile ο κώδικας ο compiler θα χρησιμοποιήσει το encoding του αρχείου για να καταλάβει ποιό string έδωσες, όχι αυτό που εννοούσες εσύ αλλά δεν προσδιόρισες.

    Στα πρακτικά τώρα. Θεωρώντας ότι όντως χρησιμοποιείς nvarchar πεδία, έχεις να λύσεις δύο προβλήματα:

    • Αποθηκεύεις δεδομένα σε non-Unicode μορφή. Εδώ υπάρχει μόνο μία λύση, η εφαρμογή σου θα πρέπει να αλλάξει για να αποθηκεύσει σωστά Unicode δεδομένα, σε UTF16.
    • Έχεις ήδη αποθηκευμένα δεδομένα σε χαλασμένη μορφή. Είτε θα πρέπει να τα πετάξεις και να τα ξαναεισάγεις, ή θα πρέπει να γράψεις κώδικα για να μετατρέψει τους χαρακτήρες από UTF8 σε UTF16 εφόσον δεν έχουν καταστραφεί κάποιοι χαρακτήρες (π.χ. αντικαταστάθηκαν με κουτάκια ή ? λόγω αδυναμίας μετατροπής κατά την αποθήκευση).

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-11-2009, 17:35 54901 σε απάντηση της 54894

    Απ: Νέα βάση με ελληνική κωδικοποίηση UTF-8

    Επίσης έκανα μια δοκιμή για να δω τι γίνεται στη βάση! Έγραψα μέσα από το Management Studio του SQL Server μια εγγραφή και την εμφανίζω μέσω PHP mssql connection σε σελίδα.

    Φαίνεται καθαρά ότι χωρίς καμία επεξεργασία από μέρους μου τα δεδομένα έρχονται ως ISO-8859-7, οπότε αν η σελίδα έχει UTF-8 encoding βγαίνουν τα γράμματα τετραγωνάκια (σε IE)!

    Γνωρίζω πως μπορώ να μετατρέψω σε επίπεδο γλώσσας το ISO-8859-7 σε UTF-8 και να το τυπώσω στη σελίδα αλλά με ενδιαφέρει να ερχόταν το connection απευθείας σε UTF-8.

    Καμία ιδέα;

  •  02-11-2009, 17:46 54902 σε απάντηση της 54901

    Απ: Νέα βάση με ελληνική κωδικοποίηση UTF-8

    Καταρχήν, ακόμα ΔΕΝ είπες τί τύπου πεδία χρησιμοποιείς. Άλλο να χρησιμοποιείς varchar (δηλαδή ASCII) και άλλο nvarchar (δηλαδή Unicode). Επίσης, όσο χρησιμοποιείς μία γλώσσα που δεν καταλαβαίνει UTF16 πάντα περίεργα αποτελέσματα θα βλέπεις.

    Για να πεισθείς ότι το πρόβλημα είναι στην εφαρμογή σου κάνε το εξής απλούστατο.

    1. Φτιάξε ένα πίνακα με ένα πεδίο τύπου nvarchar (π.χ. Name).
    2. Βάλε μία εγγραφή από το Management Studio π.χ. INSTERT INTO MYTABLE (NAME) VALUES(N'Καλημέρα')
    3. Ξαναδιάβασε την εγγραφή από το Management Studio, π.χ. SELECT * FROM MYTABLE

    Τέλος, όσο προσπαθείς να δεις τί κάνει ο SQL Server μέσω μίας γλώσσας που δεν καταλαβαίνει UTF16, το μόνο που θα βλέπεις θα είναι τα προβλήματα της γλώσσας, όχι του SQL Server.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-11-2009, 17:59 54903 σε απάντηση της 54901

    Απ: Νέα βάση με ελληνική κωδικοποίηση UTF-8

    Επίσης, δεν είπες τί driver χρησιμοποιείς. Ο drivers της ίδιας της PHP δεν κάνει μετατροπή UTF16 σε -8 και το σχετικό bug είναι ανοικτό από .... το 2002. H Microsoft έχει βγάλει το δικό της driver στο http://www.codeplex.com/SQLSRVPHP ο οποίος κάνει την μετατροπή. Εσύ ποιόν χρησιμοποιείς?
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  03-11-2009, 15:56 54911 σε απάντηση της 54902

    Απ: Νέα βάση με ελληνική κωδικοποίηση UTF-8

    nvarchar πεδία χρησιμοποιώ. Κατάλαβα την φύση του προβλήματος. Σωστά υπέθεσες ότι γράφω στη βάση UTF-8 οπότε και δεν προβάλλεται σωστά από το Management Studio.

    Ευτυχώς υπάρχει η λύση να εμφανίσω την εγγραφή σωστά στην Web εφαρμογή με encoding.

    Απόλυτα σωστή και η τελευταία παρατήρηση αλλά ήθελα να το ψάξω ώστε να γνωρίζω τι μειονεκτήματα υπάρχουν.

  •  03-11-2009, 17:44 54914 σε απάντηση της 54911

    Απ: Νέα βάση με ελληνική κωδικοποίηση UTF-8

    Μάλλον δεν κατάλαβες τελικά τί λέω από την αρχή. Το πρόβλημα βρίσκεται στο driver που χρησιμοποιείς για να μιλήσεις στον SQL Server ο οποίος δεν κάνει μετατροπή από το UTF8 που χρησιμοποιεί η PHP στο UTF16 που χρησιμοποιεί ο SQL Server. Ο λόγος μάλιστα είναι ότι ο SQL Server driver της PHP χρησιμοποιεί ένα C-API το οποίο έχει καταργηθεί εδώ και 10 τουλάχιστον χρόνια. Ούτε καν ODBC δεν χρησιμοποιεί αν είναι δυνατόν!

    Το πρόβλημα ΔΕΝ βρίσκεται στο management studio. Τα δεδομένα σου ΔΕΝ είναι κανονικά unicode strings. Αν αποθηκεύσεις από την PHP σε ένα πεδίο MyTable.MyName το 'Γιώργος' και προσπαθήσεις να το διαβάσεις από άλλο πρόγραμα π.χ. με SELECT * from MyTable where MyName='Γιώργος' ΔΕΝ θα πάρεις καμμία απάντηση γιατί ΔΕΝ θα υπάρχει στη βάση ΚΑΜΜΙΑ εγγραφή με το string 'Γιώργος'. Αν πας να βγάλεις ένα report π.χ. με Crystal ή Reporting Services ΔΕΝ θα δεις ελληνικά στα αποτελέσματα και οι παράμετροι που θα περάσεις στο report ΔΕΝ θα επιστρέψουν δεδομένα.

    Η αλλαγή του encoding στη σελίδα είναι απλό τσιρότο το οποίο αντιμετωπίζει ένα κομματάκι μόνο του προβλήματος ενώ δημιουργεί πολλά άλλα. Αν η βάση αυτή χρησιμοποιείται μόνο από την εφαρμογή σου και δεν υπάρχει ΚΑΜΜΙΑ περίπτωση να χρησιμοποιήσεις αυτά τα δεδομένα με άλλο τρόπο στο μέλλον, μπορείς να κάνεις ότι και τώρα. Διαφορετικά θα πρέπει να μετατρέπεις κάθε φορά τα δεδομένα σου σε Unicode πριν τα δουν άλλες εφαρμογές.

    Αν επιμένεις οπωσδήποτε να χρησιμοποιήσεις τους driver της PHP και όχι της Microsoft, ίσως θα έπρεπε να χρησιμοποιήσεις άλλη βάση, π.χ. MySQL ή Postgres. Δεν έχει νόημα να δουλεύεις με μία βάση αν δεν χρειάζεσαι τα features της και δεν μπορείς να επικοινωνήσεις σωστά μαζί της.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems