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

 

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

float datatype με κομμα separator

Îåêßíçóå áðü ôï ìÝëïò neoklis. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 17-09-2012, 09:36. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  15-09-2012, 09:47 71240

    float datatype με κομμα separator

    Παιδιά καλημέρα,

    Σε ένα πίνακα έχω ένα πεδίο float. Όταν κάνω select τον πίνακα (SQL Server Management Studio) το πεδίο εμφανίζεται με comma separator. Ο ίδιος πίνακας σε βάση που είναι host, το πεδίο εμφανίζεται με dot separator. Σκέφτηκα σε πρώτη φάση να ελέγξω το collation της βάσης και όντως ήταν διαφορετικό. Και οι δύο βάσεις έχουν το ίδιο collation τώρα ‘Greek_CI_AS’. To επόμενο βήμα ήταν να σβήσω τον πίνακα και να τον ξαναδημιουργήσω αλλά πάλι τίποτα. Τι μπορεί να φταίει;

    ευχαριστώ


    Dionisis
  •  15-09-2012, 11:16 71241 σε απάντηση της 71240

    Απ: float datatype με κομμα separator

    ΤΊΠΟΤΑ δεν φταίει...
    Ο SQL πάντα αποθηκεύει τα πάντα με ANSI.
    Απλα ο SSMS σε αλλα σημεία διαβάζει τα regional settings ενω σε αλλα όχι.
    Το collation δεν έχει επιρροή στο συγκεκριμένο σημείο.

    Antonios Chatzipavlis

  •  15-09-2012, 12:03 71242 σε απάντηση της 71241

    Απ: float datatype με κομμα separator

    μάλιστα..

    Μπορώ να ορίσω regional settings για συγκεκριμένη βάση; Αν όριζα language για χρήστη στο syslogins table, θα είχα διαφορετικό αποτέλεσμα;


    Dionisis
  •  15-09-2012, 21:48 71244 σε απάντηση της 71242

    Απ: float datatype με κομμα separator

    Ποιός είναι ο λόγος να κάνεις κάτι τέτοιο;

     


    Antonios Chatzipavlis

  •  15-09-2012, 22:56 71245 σε απάντηση της 71244

    Απ: float datatype με κομμα separator

    Δεν υπάρχει συγκεκριμένος λόγος, απλά ήταν μια παρατήρηση στα αποτελέσματα που έπαιρνα από select, συγκρίνοντας την local με την host db.


    Dionisis
  •  17-09-2012, 09:36 71253 σε απάντηση της 71245

    Απ: float datatype με κομμα separator

    Όπως έχουμε πει Ν  φορές, 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
  •  17-09-2012, 09:36 71252 σε απάντηση της 71245

    Απ: float datatype με κομμα separator

    Όπως έχουμε πει Ν  φορές, 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
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems