Όπως έχουμε πει Ν φορές, o SQL Server ΔΕΝ αποθηκεύει κανένα κόμμα ή τελεία, όταν αποθηκεύεις κάποιο numeric ή float πεδίο. Το κόμμα και η τελεία εμφανίζονται ΜΟΝΟ όταν η αριθμητική τιμή μετατρέπεται σε κείμενο: όταν δηλαδή προσπαθείς να τη δείξεις στην εφαρμογή σου, ή όταν συνδυάσεις στο ίδιο SQL statement κείμενο και νούμερα, ή όταν προσπαθείς να κάνεις join ή να συγκρίνεις αριθμητικό πεδίο με text.
Το locale που θα χρησιμοποιηθεί εξαρτάται από το πού γίνεται η μετατροπή (στον client/browser ή στον server) και από το locale της ΣΥΝΔΕΣΗΣ, και πολύ σπάνια της βάσης.
- Αν τα αριθμητικά δεδομένα έχουν φτάσει στον client, η μετατροπή θα γίνει σύμφωνα με το Thread.CurrentCulture (είναι αυτό που επιλέγει ο κάθε χρήστης, όχι το UI locale).
- Αν η μετατροπή γίνει στο statement, με κάποιο cast ή κάποιο concatenation, θα χρησιμοποιήθεί το locale της σύνδεσης, το οποίο είναι ίδιο με αυτό της εφαρμογής, εκτός και το αλλάξεις με statement
- ΜΟΝΟ αν για κάποιο λόγο συγκρίνεις αριθμητικό πεδίο με κείμενο (π.χ. σε join ή where) θα χρησιμοποιηθεί το collation, γιατί εκεί ο SQL Server δεν μπορεί να ξέρει ποιό locale θέλεις να χρησιμοποιήσεις. Αυτό όμως είναι πάρα πολύ σπάνιο και κατά κανόνα σημαίνει ότι έχεις κάνει κάποιο λάθος στο statement.
Προφανώς, ο καλύτερος τρόπος να αποφύγεις αυτή τη μετατροπή είναι να μην την κάνεις: αν δεν υπάρχει σαφέστατος λόγος να μετατρέψεις το νούμερο σε string, μην το μετατρέπεις. Άσε να φτάσει το αριθμητικό στην εφαρμογή και κάνε την μετατροπή εκεί και μόνο.
Από την άλλη, είναι πολύ πιθανό αυτό που βλέπεις να είναι δική σου παρανόηση. Μπορεί ο χρήστης να έχει ελληνικό Locale και εσύ να περιμένεις να δεις αγγλική υποδιαστολή επειδή έχει αγγλικό UI ή το αντίστροφο. Άλλο το UI locale και άλλο το locale που προέρχεται από τα Regional settings. Το UI locale επηρεάζει τα λεκτικά που βλέπεις στο λειτουργικό και τις εφαρμογές και μόνο. Μόνο το user locale επηρεάζει το πως γίνονται οι μετατροπές. Αν για παράδειγμα η εφαρμογή σου έχει Thread.CurrentCulture = Greek και Thread.CurrentUICutlure = English, θα εμφανιστεί η ελληνική, όχι η αγγλική υποδιαστολή.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos