Ο SQL Server ΔΕΝ ΧΡΕΙΑΖΕΤΑΙ κόλπα για να υποστηρίξει τα ελληνικά Τα προβλήματα δημιουργούνται πάντα όταν μία εφαρμογή δεν υποστηρίζει unicode και μπερδεύει τα codepages. Δεν φταίνε τα fonts, η έκδοση του λειτουργικού ή του SQL Server. Το πρόβλημα εμφανίζεται αν πας να αποθηκεύσεις από ένα μηχάνημα με A system locale ASCII δεδομένα σε κάποια βάση με B locale και μετά δοκιμάσεις να τα διαβάσεις από ένα άλλο μηχάνημα με Γ locale. Το ότι ως τώρα τα δεδομένα εμφανίζονταν σωστά είναι καθαρά θέμα τύχης: δεν έτυχε ποτέ το locale του client και του server να διαφέρουν.
Στη συγκεκριμένη περίπτωση πρέπει να αποθηκεύθηκαν τα δεδομένα με ένα codepage και να προσπαθείς να τα διαβάσεις με ένα άλλο στο οποίο δεν γίνεται μετατροπή. Τα ??? εμφανίζονται όταν ο OLEDB driver προσπαθεί να μετατρέψει ένα χαρακτήρα από το codepage που του λέει η βάση σε αυτό που του ζητάει η εφαρμογή και δεν τα καταφέρνει. Αν για παράδειγμα κάποιος στο PC με αγγλικό locale σώσει ελληνικσε server με ελληνικό collation το string που θα αποθηκευθεί θα είναι άσχετο.
Δεν έχει νόημα η αλλαγή του τύπου των δεδομένων εκ των υστέρων, γιατί τα αρχικά δεδομένα είναι αυτά που έχουν το πρόβλημα, όχι ο τύπος των αποθηκευμένων δεδομένων. Τα strings αποθηκεύθηκαν με λάθος ASCII codes οπότε η αλλαγή από varchar σε nvarchar θα δημιουργήσει Unicode χαρακτήρες οι οποίοι αναφέρονται σε λάθος χαρακτήρες. Αν για παράδειγμα έχεις ο client έχει ελληνικό locale το ελληνικό Α είναι το 193. Σε ένα μηχάνημα με αγγλικό locale όμως το ASCII 193 αντιστοιχεί στο Á. Όταν εσύ αλλάξεις τον τύπο του πεδίο από varchar σε nvarchar ο SQL Server θα δεί ότι ζητάς το αγγλικό ASCII 193 να γίνει Unicode, δηλαδή Á. Όταν αποθηκεύεις ένα string στον SQL Server ο OLEDB driver προσπαθεί να αποφύγει αυτό το πρόβλημα μετατρέποντας τα ASCII codes από το locale του μηχανήματος σε αυτό της βάσης. Αν από ένα μηχάνημα με αγγλικό locale στείλεις το ελληνικό Α σε βάση με αγγλικό locale, δεν θα γίνει μετατροπή και αυτό που θα αποθηκευθεί θα είναι το Á. Αν το locale των μηχανημάτων διαφέρει ο OLEDB Driver θα προσπαθήσει να κάνει τη μετατροπή. Αν η μετατροπή δεν γίνεται γιατί δεν υπάρχει αντιστοιχία θα αποθηκεύσει ??.
Αν τα ??? εμφανίζονται μέσα στη βάση είναι πολύ πιθανό ότι το πρόβλημα δημιουργήθηκε κατά την αποθήκευση των δεδομένων και τα strings έχουν χαθεί. Αν εμφανίζονται μόνο όταν τα διαβάζεις από τη βάση σημαίνει ότι υπάρχει ασυμβατότητα μεταξύ των locale της βάσης και του client μηχανήματος.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos