Ο Sql Server δεν χρειάζεται κόλπα για να υποστηρίξει τα ελληνικά . Μπορεί άνετα να υποστηρίξει οποιαδήποτε γλώσσα, ακόμα και αραβικά, με μία default εγκατάσταση και χρησιμοποιώντας Unicode. Σχεδόν σίγουρα το πρόβλημα οφείλεται σε ένα από τρεις παράγοντες (ή και όλους):
- Οι πίνακες σου περιέχουν στήλες με τον ANSI τύπο (var)char αντί για τον Unicode, n(var)char.
- Στα query περνάς τα ελληνικά ως ANSI strings αντί για Unicode strings. Είτε φτιάχνεις SQL Strings με λάθος τρόπο, είτε περνάς τις παραμέτρους ως varchar αντί για nvarchar.
- Όταν δημιούργησες τη βάση όρισες ότι το collation θα είναι Case Sensitive (CS) αντί για Case Insensitive (CI). Αν δεν όρισες εσύ το collation που ήθελες να χρησιμοποιήσεις ο SQL Server χρησιμοποίησε ως default το collation που είχες ορίσει κατά την αρχική εγκατάσταση.
Όταν φτιάχνεις ένα query πρέπει να βάζεις το λατινικό N πριν από κάθε string για να θεωρηθεί ότι το string είναι Unicode. Για παράδειγμα το SELECT * FROM MyTable WHERE NAME='ΛΑΜΠΡΟΠΟΥΛΟΣ' θεωρεί ότι το 'ΛΑΜΠΡΟΠΟΥΛΟΣ' είναι ANSI ενώ το SELECT * FROM MyTable WHERE NAME=N'ΛΑΜΠΡΟΠΟΥΛΟΣ' θεωρεί ότι είναι Unicode. Το δεύτερο query θα σου επιστρέψει πάντα το σωστό αποτέλεσμα ενώ το πρώτο μπορεί να αποτύχει αν π.χ. το μηχάνημα σου χρησιμοποιεί το αγγλικό locale.
Όσον αφορά την τρίτη περίπτωση, στην περίπτωση που η βάση και οι πίνακες σου έχουν δημιουργηθεί με κάποιο Case Sensitive collation, δίνοντας ένα string με κεφαλαία θα πάρεις αποτελέσματα μόνο αν ο πίνακας περιέχει το όνομα σε κεφαλαία. Μπορείς να ορίσεις στο SELECT να χρησιμοποιήσει ένα συγκεκριμένο collation, π.χ. SELECT * FROM MyTable WHERE NAME=N'ΛΑΜΠΡΟΠΟΥΛΟΣ' COLLATE GREEK_CI_AS.
Μπορείς να βρεις περισσότερα στο documentation του SQL Server και συγκεκριμένα στα κεφάλαια International Considerations for Databases and Database Engine Applications και πιο συγκεκριμένα στο Working with Collations και το Collation Precedence το οποίο μάλιστα χρησιμοποιεί για παράδειγμα ... τα ελληνικά.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos