Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Versão original do produto: SQL Server
Número original do KB: 904803
Sintomas
Considere o cenário a seguir.
Você usa o SQL Server Management Studio para consultar dados de caracteres de um banco de dados do SQL Server que usa um tipo de dados não Unicode. Por exemplo, o banco de dados do SQL Server usa o
char
tipo de dados ,varchar
, ortext
.A página de código do computador cliente difere da página de código do banco de dados. A página de código está associada à ordenação do banco de dados.
Nesse cenário, os dados de caracteres são representados incorretamente.
Por exemplo, você pode enfrentar um dos seguintes problemas:
Os dados do caractere são representados como um ponto de interrogação (
?
). Você pode ver esse problema se inserir ou atualizar os dados de caractere como um tipo de dados não Unicode antes de consultar os dados de caractere. Esse problema ocorrerá se você fizer essa alteração usando o SQL Server Management Studio em um computador cliente que tenha uma página de código diferente.Os dados do caractere são representados como dados corrompidos. Os dados de caractere da página de código X são armazenados em uma coluna não Unicode da página de código Y. Além disso, os dados de caractere não são traduzidos. Esse problema ocorre quando você consulta os dados de caractere usando o SQL Server Management Studio.
Observação
Quando você consulta os dados de caractere usando o SQL Server Management Studio, os dados de caractere são representados corretamente se a configuração Executar conversão de dados de caractere (também conhecida como parâmetro) estiver desabilitada
Auto Translate
. OAuto Translate
parâmetro é um parâmetro daConnectionString
propriedade do Microsoft OLE DB Provider for SQL Server e do Microsoft .NET Framework Data Provider for OLE DB.
Causa
Esse problema ocorre porque os dados de caractere da página de código X são armazenados em uma coluna não Unicode da página de código Y, que não tem suporte.
No SQL Server, quando você usa um literal de cadeia de caracteres de um tipo de dados não Unicode, o literal de cadeia de caracteres é convertido usando a página de código padrão do banco de dados derivada da ordenação do banco de dados. Armazenar os dados de caracteres da página de código X em uma coluna da página de código Y pode causar perda ou corrupção de dados.
Se os dados de caractere forem representados como dados corrompidos, os dados só poderão ser representados corretamente se você desabilitar o Auto Translate
parâmetro para Microsoft OLE DB Provider for SQL Server ou Microsoft .NET Framework Data Provider for OLE DB.
Observação
O SQL Server Management Studio usa o Provedor de Dados do Microsoft .NET Framework para SQL Server para se conectar ao banco de dados do SQL Server. Esse provedor de dados não dá suporte ao Auto Translate
parâmetro.
Solução alternativa
Para contornar esse problema, use um dos seguintes métodos:
Método 1: Usar um tipo de dados Unicode em vez de um tipo de dados não Unicode
Altere as colunas para um tipo de dados Unicode para evitar todos os problemas causados pela conversão da página de código. Por exemplo, use o nchar
tipo de dados , nvarchar
ou ntext
.
Método 2: Usar uma ordenação apropriada para o banco de dados
Se você precisar usar um tipo de dados não Unicode, sempre verifique se a página de código do banco de dados e a página de código de todas as colunas não Unicode podem armazenar os dados não Unicode corretamente. Por exemplo, se você quiser armazenar dados de caracteres da página de código 949 (coreano), use uma ordenação coreana para o banco de dados. Por exemplo, use a Korean_Wansung_CI_AS
ordenação para o banco de dados.
Método 3: Use o tipo de dados "binário" ou "varbinário"
Se você quiser que o banco de dados armazene e recupere diretamente os valores exatos de bytes dos caracteres que são manipulados sem tentar executar a conversão de página de código apropriada, use o binary
tipo de dados or varbinary
.
Método 4: Use uma ferramenta diferente para armazenar e recuperar dados e desative o parâmetro "Tradução automática"
Aviso
Não testamos nem damos suporte ao armazenamento dos dados de caracteres da página de código X em uma coluna da página de código Y. Essa operação pode causar resultados de consulta linguisticamente incorretos, correspondência ou ordenação incorreta de cadeia de caracteres e conversão inesperada da página de código (corrupção de dados). Recomendamos que você use um dos outros métodos para contornar esse problema.
Quando você usa o Microsoft OLE DB Provider for SQL Server para se conectar a um banco de dados que tem uma página de código diferente e tenta consultar dados de caracteres de uma coluna de tipo de dados não Unicode, certifique-se de armazenar os caracteres não convertidos no banco de dados.
Observação
O exemplo a seguir pressupõe que a página de código do computador cliente seja coreana (CP949) e que a página de código do banco de dados do SQL Server seja inglesa (CP1252). Você deve substituir os espaços reservados nos exemplos de código por valores apropriados para sua situação.
Para contornar esse problema, siga estas etapas:
Converta manualmente os caracteres em dados brutos e insira os dados no banco de dados usando a página de código do banco de dados. Para fazer essa operação, use um snippet de código semelhante ao seguinte:
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;
Quando quiser consultar os dados, use o Microsoft OLE DB Provider for SQL Server ou o Microsoft .NET Framework Data Provider for SQL Server para se conectar ao banco de dados e defina o
Auto Translate
parâmetro comoFalse
. Para fazer essa operação, use um snippet de código semelhante ao seguinte:OleDbConnection conn=new OleDbConnection("Provider=SQLOLEDB;" + " Initial Catalog =<yourdatabase>;"+ "User id=<youruserid>; Password=<yourpassword>;"+ "Auto Translate=False"); // code for representing the character data;
Mais informações
Para reproduzir o problema, siga estas etapas:
No computador cliente que tem coreano (CP949) como a página de código padrão, inicie o SQL Server Management Studio.
Conecte-se a um banco de dados que tenha inglês (CP1252) como a página de código padrão.
Crie uma tabela no banco de dados usando a seguinte consulta:
CREATE TABLE tbTest (A char(20), NA nchar(10), Comment char(20))
Insira um caractere coreano no banco de dados usando a seguinte consulta:
INSERT INTO tbTest (A,NA,Comment) VALUES('가',N'가','SQLServer/INSERT')
Crie uma consulta seleção para recuperar os dados usando a seguinte consulta:
SELECT * FROM tbTest
Você recebe os seguintes resultados. O valor na coluna A é um ponto de interrogação.
A NA Comment
-------------------- ---------- --------------------
? 가 SQLServer/INSERT