Που δεν μπορεί να μετατρέψει σωστά χαρακτήρα δεδομένων από έναν υπολογιστή-πελάτη σε ένα διακομιστή, χρησιμοποιώντας το πρόγραμμα οδήγησης SQL Server ODBC, εάν η κωδικοσελίδα του προγράμματος-πελάτη διαφέρει από την κωδικοσελίδα του διακομιστή

Συμπτώματα

Κατά τη χρήση του MDAC 2.1 ή νεότερη έκδοση του προγράμματος οδήγησης SQL Server ODBC (έκδοση 3.70.0623 ή νεότερη έκδοση) ή την υπηρεσία παροχής OLEDB (έκδοση 7.01.0623 ή νεότερη έκδοση), κάτω από ορισμένες συνθήκες, ενδέχεται να αντιμετωπίσετε μετάφραση δεδομένων χαρακτήρων από την κωδικοσελίδα του προγράμματος-πελάτη στην κωδικοσελίδα διακομιστή, ακόμα και όταν είναι απενεργοποιημένη η Autotranslation για τη σύνδεση.

Αιτία

Autotranslation δεν είναι ο μόνος μηχανισμός που μπορεί να έχει ως αποτέλεσμα την μετατροπή κωδικοσελίδας. Το πρόγραμμα οδήγησης ODBC του SQL Server 7.0 και την υπηρεσία παροχής OLEDB εισάγουν μια νέα συμπεριφορά κατά τη σύνδεση σε MSDE 1.0, SQL Server 7.0 ή νεότερες εκδόσεις είτε. Όλες οι προτάσεις SQL που αποστέλλονται ως συμβάν γλώσσας μετατρέπονται σε Unicode στον υπολογιστή-πελάτη πριν σταλούν στο διακομιστή. Το εφέ τέλος αυτού είναι παρόμοια με μια Autotranslation όλων των δεδομένων που απορρέουν από το πρόγραμμα-πελάτη στο διακομιστή μέσω μιας γλώσσας συμβάν, ανεξάρτητα από την τρέχουσα ρύθμιση Autotranslation για τη σύνδεση. Αυτό δεν θα προκαλέσει δυσκολίες εκτός όταν προσπαθείτε να αποθηκεύσετε δεδομένα χαρακτήρα μη μετάφραση από μια κωδικοσελίδα εκτός από την κωδικοσελίδα του διακομιστή SQL.

Εναλλακτικός τρόπος αντιμετώπισης

Μην αποθηκεύετε κώδικα σελίδας X δεδομένα σε μια κωδικοσελίδα Y SQL Server (για παράδειγμα, κωδικός σελίδας 950 δεδομένα στον κώδικα σελίδας 1252 διακομιστή). Ενώ αυτό ήταν δυνατόν, σε ορισμένες περιπτώσεις με προηγούμενες εκδόσεις του SQL Server, πάντα έχει δεν υποστηρίζεται. Σε ένα διακομιστή SQL 1252, οτιδήποτε εκτός από ένα 1252 χαρακτήρας δεν είναι έγκυρος χαρακτήρας δεδομένων. Δεδομένα χαρακτήρων μη Unicode από διαφορετική κωδικοσελίδα δεν θα ταξινομηθούν σωστά και, στην περίπτωση των δύο byte (DBCS) δεδομένων, SQL Server δεν θα αναγνωρίσει όρια των χαρακτήρων σωστά. Αυτό μπορεί να προκαλέσει σημαντικά προβλήματα, όπως το ζήτημα που περιγράφεται στο ακόλουθο άρθρο της Γνωσιακής Βάσης της Microsoft:
155723 INF: SQL Server περικοπή συμβολοσειράς DBCS

Η καλύτερη επιλογή για την κωδικοσελίδα του διακομιστή SQL είναι η κωδικοσελίδα τους υπολογιστές-πελάτες που θα την πρόσβαση στο διακομιστή.

Ο διακομιστής και ο υπολογιστής-πελάτης μπορεί να έχει διαφορετικές κωδικοσελίδες, αλλά πρέπει να βεβαιωθείτε ότι είναι ενεργοποιημένη Autotranslation του υπολογιστή-πελάτη, ώστε να λαμβάνετε τη σωστή μετάφραση δεδομένων προς και από την κωδικοσελίδα του διακομιστή σε όλες τις περιπτώσεις.

Εάν ο διακομιστής σας πρέπει να αποθηκεύσετε δεδομένα από πολλές κωδικοσελίδες, την υποστηριζόμενη λύση είναι να αποθηκεύσετε τα δεδομένα σε στήλες Unicode (NVARCHAR/NCHAR/NTEXT).

Εάν η κατάστασή σας απαιτεί ότι αποθηκεύετε κώδικα σελίδας X δεδομένα σε μια κωδικοσελίδα Y SQL Server, υπάρχουν μόνο δύο τρόποι για να το κάνετε αυτό με αξιόπιστο τρόπο:
  • Αποθηκεύσετε τα δεδομένα σε στήλες δυαδικό στήλες (ΔΥΑΔΙΚΌ/VARBINARY/ΕΙΚΌΝΑΣ).
  • Γράψτε την εφαρμογή σας να χρησιμοποιεί κλήσεις απομακρυσμένης διαδικασίας (RPC) για όλες τις προτάσεις SQL που ασχολούνται με δεδομένα χαρακτήρων. Τα δεδομένα που αποστέλλονται μέσω ενός συμβάντος RPC δεν υπόκειται σε αυτήν τη μετατροπή. Σημειώστε ότι δεν υπάρχει τίποτα σε επίπεδο DSN που μπορείτε να κάνετε για να αλλάξετε τον τύπο των συμβάντων που αποστέλλονται ή πρόγραμμα οδήγησης. Εάν αποστέλλεται μια εντολή ως γλώσσα ή συμβάν RPC εξαρτάται πλήρως από το API και τη σύνταξη που επιλέγεται από τον προγραμματιστή, όταν η εφαρμογή έχει γραφεί.

Περισσότερες πληροφορίες

Autotranslation (δηλαδή, το "Πραγματοποίηση μετάφρασης για δεδομένα χαρακτήρων" πλαίσια ελέγχου σε νέες εφαρμογές ODBC) μετατρέπει δεδομένα χαρακτήρων από την κωδικοσελίδα του προγράμματος-πελάτη στην κωδικοσελίδα του διακομιστή πριν από την αποστολή δεδομένων στο διακομιστή, χρησιμοποιώντας Unicode ως μέσο μετάφρασης. Ωστόσο, το πρόγραμμα οδήγησης SQL Server ODBC 3.7 μετατρέπει επίσης όλες τις προτάσεις SQL που αποστέλλονται ως συμβάν γλώσσα σε Unicode πριν τα τοποθετήσετε του καλωδίου, η οποία έχει αποτελέσματα που είναι παρόμοια με Autotranslation αλλά δεν ελέγχεται από τη ρύθμιση Autotranslation. Αντίθετα, χαρακτήρα των δεδομένων που διακινούνται από το διακομιστή σε υπολογιστές-πελάτες να τηρεί τη σημαία Autotranslation; Εάν είναι απενεργοποιημένη η Autotranslation των δεδομένων φτάνει στον υπολογιστή-πελάτη εφαρμογής με τους ίδιους κωδικούς χαρακτήρων με τα δεδομένα που είχαν στο διακομιστή. Ομοίως, μετάφραση δεδομένων για συμβάντα RPC προγράμματος-πελάτη / διακομιστή μπορεί να απενεργοποιηθεί με την απενεργοποίηση της Autotranslation. Ακολουθεί μια απλή δέσμη ενεργειών που δείχνει πώς αυτή η συμπεριφορά επηρεάζει συμβάντα γλώσσα. Αυτό το παράδειγμα εκτελέσθηκε από ανάλυση ερωτημάτων σε έναν κώδικα σελίδας 1252 υπολογιστή-πελάτη συνδέεστε με διακομιστή 437 σελίδα κώδικα:
-- Turn Autotranslation off here.    USE tempdb
GO
CREATE TABLE t1 (c1 int, c2 char(1))
GO

-- Enter a yen character, using the keystroke ALT-0165.
INSERT INTO t1 VALUES (1, '¥')
SELECT c1, c2, ASCII (c2) FROM t1
c1          c2                       ----------- ---- ----------- 
1  157

(1 row(s) affected)
Σημειώστε τις ακόλουθες πληροφορίες σχετικά με το προηγούμενο παράδειγμα:
  • Ακόμη και αν Autotranslation ήταν απενεργοποιημένη κατά τη διάρκεια αυτή τη δέσμη, τον κωδικό χαρακτήρα 165 (γιεν στην κωδικοσελίδα 1252) μετατράπηκε σε 157 (γιεν στην κωδικοσελίδα 437). Αυτό συμβαίνει επειδή το πρόγραμμα οδήγησης ODBC μετατραπεί η συμβολοσειρά SQL σε Unicode πριν το στείλετε το διακομιστή, έτσι ώστε ο διακομιστής δεν ήταν σε θέση να το μετατρέψετε σε κατάλληλο χαρακτήρα για αποθήκευση σε κωδικοσελίδα 437.
  • Όταν ο υπολογιστής-πελάτης εκτελέστηκε μια ΕΠΙΛΟΓΉ για την ανάκτηση δεδομένων που είχε αποθηκευθεί μόνο, ο χαρακτήρας 157 έφτασαν μη μεταφρασμένα στον υπολογιστή-πελάτη (157 εμφανίζεται ως ένα πλαίσιο "" σε ένα πρόγραμμα-πελάτη του κώδικα σελίδας 1252). Αυτό συμβαίνει επειδή η μετατροπή που αναφέρονται σε αυτό το άρθρο ισχύει μόνο για τα δεδομένα που αποστέλλονται από τον υπολογιστή-πελάτη στο διακομιστή και όχι από το διακομιστή στον υπολογιστή-πελάτη. Τα δεδομένα δεν μεταφράστηκε, επειδή η ρύθμιση Autotranslation είναι απενεργοποιημένη.

-- Turn Autotranslation back on before running the following batch.    INSERT INTO t1 VALUES (2, '¥')
SELECT c1, c2, ASCII (c2) FROM t1
c1          c2                       ----------- ---- ----------- 
1 ¥ 157
2 ¥ 157

(2 row(s) affected)
Στην περίπτωση αυτή, η ενεργοποίηση Autotranslation πίσω είχε καμία επίπτωση στην η μετάφραση από τον υπολογιστή-πελάτη στο διακομιστή (δηλαδή, συνέβη το ίδιο σωστή μετάφραση από κωδικό χαρακτήρα 165 κωδικό χαρακτήρα 157), αλλά να είχε συνέπειες για τα δεδομένα που ανακτώνται από το διακομιστή. Σημειώστε ότι όταν την πρόταση SELECT εκτελείται αυτήν τη στιγμή (με Autotranslation σε), τα σύμβολα γιεν εμφανίζονται σωστά κατά την εφαρμογή του κώδικα σελίδας 1252 επειδή αυτά έχουν μεταφραστεί από κωδικό χαρακτήρα 157 σε κωδικό χαρακτήρα 165 από το μηχανισμό Autotranslation.

Θα δείτε αυτήν τη συμπεριφορά (μετατροπή συμβάντων γλώσσα σε Unicode στον υπολογιστή-πελάτη) όταν χρησιμοποιείτε οποιαδήποτε SQL Server ODBC έκδοση 3.70 ή νεότερη έκδοση και τη σύνδεση με τον SQL Server 7.0 ή νεότερη έκδοση του προγράμματος οδήγησης. Αυτό δεν θα συμβεί όταν χρησιμοποιείτε παλαιότερα προγράμματα οδήγησης ODBC ή όταν χρησιμοποιείτε το πρόγραμμα οδήγησης 3.7 για να συνδεθείτε στον SQL Server 6.5 ή παλιότερη έκδοση. Επιπλέον, εάν αποθηκεύετε τα δεδομένα σας σε στήλες Unicode (NCHAR/NVARCHAR/NTEXT) η μετατροπή δεν θα είναι ένα ζήτημα.
Για περισσότερες πληροφορίες σχετικά με το πώς απεικονίζονται τα δεδομένα χαρακτήρων του SQL Server 2005, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:

904803 χαρακτήρας απεικονίζονται τα δεδομένα σωστά όταν η κωδικοσελίδα του υπολογιστή-πελάτη διαφέρει από την κωδικοσελίδα της βάσης δεδομένων στον SQL Server 2005

Ιδιότητες

Αναγνωριστικό άρθρου: 234748 - Τελευταία αναθεώρηση: 10 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια