Condividi tramite


I dati di tipo carattere sono rappresentati in modo non corretto quando la tabella codici del computer client è diversa da quella del database

Versione originale del prodotto: SQL Server
Numero KB originale: 904803

Sintomi

Prendi in considerazione lo scenario seguente:

  • Si usa SQL Server Management Studio per eseguire query sui dati di tipo carattere da un database di SQL Server che usa un tipo di dati non Unicode. Ad esempio, il database di SQL Server usa il chartipo di dati , varcharo text .

  • La tabella codici del computer client è diversa dalla tabella codici del database. La tabella codici è associata alle regole di confronto del database.

In questo scenario i dati di tipo carattere sono rappresentati in modo non corretto.

Ad esempio, è possibile che si verifichi uno dei problemi seguenti:

  • I dati di tipo carattere sono rappresentati come punto interrogativo (?). Questo problema può verificarsi se si inseriscono o si aggiornano i dati di tipo carattere come tipo di dati non Unicode prima di eseguire query sui dati di tipo carattere. Questo problema si verifica se si apporta questa modifica usando SQL Server Management Studio in un computer client con una tabella codici diversa.

  • I dati di tipo carattere sono rappresentati come dati danneggiati. I dati di tipo carattere della tabella codici X vengono archiviati in una colonna non Unicode della tabella codici Y. Inoltre, i dati di tipo carattere non vengono convertiti. Questo problema si verifica quando si eseguono query sui dati di tipo carattere usando SQL Server Management Studio.

    Note

    Quando si eseguono query sui dati di tipo carattere usando SQL Server Management Studio, i dati di tipo carattere vengono rappresentati correttamente se l'impostazione Esegui conversione per i dati di tipo carattere (nota anche come Auto Translate parametro) è disabilitata. Il Auto Translate parametro è un parametro della ConnectionString proprietà per il provider Microsoft OLE DB per SQL Server e per Microsoft .NET Framework provider di dati per OLE DB.

Causa

Questo problema si verifica perché i dati di tipo carattere della tabella codici X vengono archiviati in una colonna non Unicode della tabella codici Y, che non è supportata.

In SQL Server, quando si usa un valore letterale stringa di un tipo di dati non Unicode, il valore letterale stringa viene convertito usando la tabella codici predefinita del database derivata dalle regole di confronto del database. L'archiviazione dei dati di tipo carattere della tabella codici X in una colonna della tabella codici Y può causare la perdita o il danneggiamento dei dati.

Se i dati di tipo carattere sono rappresentati come dati danneggiati, i dati possono essere rappresentati correttamente solo se si disabilita il Auto Translate parametro per il provider Microsoft OLE DB per SQL Server o Microsoft .NET Framework provider di dati per OLE DB.

Note

SQL Server Management Studio usa Microsoft .NET Framework provider di dati per SQL Server per connettersi al database di SQL Server. Questo provider di dati non supporta il Auto Translate parametro .

Soluzione alternativa

Per risolvere questo problema, usare uno dei metodi seguenti:

Metodo 1: usare un tipo di dati Unicode anziché un tipo di dati non Unicode

Modificare le colonne in un tipo di dati Unicode per evitare tutti i problemi causati dalla conversione della tabella codici. Ad esempio, usare il nchartipo di dati , nvarcharo ntext .

Metodo 2: Usare regole di confronto appropriate per il database

Se è necessario utilizzare un tipo di dati non Unicode, assicurarsi sempre che la tabella codici del database e la tabella codici di qualsiasi colonna non Unicode possa archiviare correttamente i dati non Unicode. Ad esempio, se si desidera archiviare i dati di tipo carattere della tabella codici 949 (coreano), usare regole di confronto coreane per il database. Ad esempio, usare le Korean_Wansung_CI_AS regole di confronto per il database.

Metodo 3: usare il tipo di dati "binary" o "varbinary"

Se si desidera che il database archivii e recuperi direttamente i valori di byte esatti dei caratteri gestiti senza tentare di eseguire la conversione della tabella codici appropriata, usare il binary tipo di dati o varbinary .

Metodo 4: usare uno strumento diverso per archiviare e recuperare i dati e disabilitare il parametro "Conversione automatica"

Avviso

Non viene testato o supportato l'archiviazione dei dati di tipo carattere della tabella codici X in una colonna della tabella codici Y. Questa operazione può causare risultati di query linguisticamente errati, corrispondenza o ordinamento di stringhe non corrette e conversione imprevista della tabella codici (danneggiamento dei dati). È consigliabile usare uno degli altri metodi per risolvere il problema.

Quando si usa il provider Microsoft OLE DB per SQL Server per connettersi a un database con una tabella codici diversa e si tenta di eseguire query sui dati di tipo carattere da una colonna di tipo di dati non Unicode, assicurarsi di archiviare i caratteri non tradotti nel database.

Note

Nell'esempio seguente si presuppone che la tabella codici del computer client sia coreana (CP949) e che la tabella codici del database di SQL Server sia inglese (CP1252). È necessario sostituire i segnaposto negli esempi di codice con valori appropriati per la situazione.

Per aggirare questo problema, attenersi alla seguente procedura:

  1. Convertire manualmente i caratteri in dati non elaborati e quindi inserire i dati nel database usando la tabella codici del database. Per eseguire questa operazione, usare un frammento di codice simile al seguente:

    string strsrc="가";string strsrc="가";
    string strtag=Encoding.GetEncoding(1252).GetString(Encoding.GetEncoding(949).GetBytes (strsrc));
    sql="insert into <tablename> (<column>,) values ('" + strtag + "')";
    // code for updating the database;
    
  2. Quando si desidera eseguire query sui dati, usare il provider Microsoft OLE DB per SQL Server o Microsoft .NET Framework provider di dati per SQL Server per connettersi al database e quindi impostare il Auto Translate parametro su False. Per eseguire questa operazione, usare un frammento di codice simile al seguente:

    OleDbConnection conn=new OleDbConnection("Provider=SQLOLEDB;" +
    " Initial Catalog =<yourdatabase>;"+
    "User id=<youruserid>; Password=<yourpassword>;"+
    "Auto Translate=False");
    // code for representing the character data;
    

Ulteriori informazioni

Per riprodurre il problema, seguire questa procedura:

  1. Nel computer client con coreano (CP949) come tabella codici predefinita avviare SQL Server Management Studio.

  2. Connettersi a un database con inglese (CP1252) come tabella codici predefinita.

  3. Creare una tabella nel database usando la query seguente:

    CREATE TABLE tbTest (A char(20), NA nchar(10), Comment char(20))
    
  4. Inserire un carattere coreano nel database usando la query seguente:

    INSERT INTO tbTest (A,NA,Comment) VALUES('가',N'가','SQLServer/INSERT')
    
  5. Creare una query di selezione per recuperare i dati usando la query seguente:

    SELECT * FROM tbTest
    

Si ricevono i risultati seguenti. Il valore nella colonna A è un punto interrogativo.


A                    NA         Comment
-------------------- ---------- --------------------
?                    가          SQLServer/INSERT

Riferimenti