none
Recuperar caractere ASCII Zero - Acho que é BUG RRS feed

  • Pergunta

  • Caros amigos,

    Tem um sistema aqui na empresa, que armazena um campo chamado MarcPart, no qual há vários caracteres ASCII. Está em um campo do tipo Varchar(MAX) com Collation Latin1_General_CI_AI. Acontece que dentro deste campo há alguns caracteres ascii não imprimíveis como o 29, 30, 31 e 00. Acontece que o 00 eu não consigo recuperar para um arquivo. Quando eu faço uma query que recupera algum caractere que está como 00, o SSMS (Management Studio) substitui por espaço em branco (32).

    Para reproduzir este problema, basta entrar no SSMS, iniciar uma nova sessão em qualquer database, Ir no menu Query, Results to File e executar a seguinte query abaixo.

    SELECT CHAR(0)

    Agora basta abrir o arquivo em um editor hexadecimal, como UltraEdit ou Notepad++ com plugin Hex e analisar o arquivo salvo. Você perceberá que o caractere que foi para o arquivo é o 0x20 (decimal 32), que é o espaço em branco. Acontece que isso vai me trazer grandes problemas, pois preciso gerar arquivos conforme os dados estão no banco, com caracteres 00. Alguém tem uma solução para isso, usando o SSMS?

    Obrigado,

    DBA Cabuloso
    Lucas Benevides

    quarta-feira, 25 de julho de 2012 19:15

Todas as Respostas

  • Cabuloso,

    Tente utilizar o NVarchar(Max) ao invês do Varchar(Max). Tipos de dados NChar, NVarchar, NVarchar(Max) utilizão a tabela de caracteres Unicode.

    Vale ressaltar que na Tabela ASCII o Caracter (0) é o mesmo que o Caracter (32), então é necessário analisar também o Collation que você esta utilizando para identificar a compatibilidade.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quinta-feira, 26 de julho de 2012 12:34
  • Prezado Junior,

    O caractere 0 é 0 e 32 é 32. Eles são armazenados diferentemente no banco de dados e deveriam ser gravados em arquivo conforme estão no banco. Fiz o teste em Unicode e deu o mesmo erro. Só que para gravar o 00 no banco utilizei a mesma função CHAR(0).

    Trata-se de bug ou imperfeição do Management Studio, pois fiz um programa em C#.net para pegar o conteúdo do banco e gravar em um arquivo e os caracteres 00 foram corretamente gravados no arquivo como 00. Portanto a funcionalidade de gravar em arquivo (Results to file) do SSMS deve ser corrigida.

    Se a equipe da Microsoft quiser reproduzir o erro, é só seguir as instruções no tópico inicial deste post. Basta ter um editor hexadecimal para conferir.

    Abraço
    DBA Cabuloso
    Lucas Benevides

    quinta-feira, 26 de julho de 2012 14:29
  • Cabuloso,

    Sinceramente não sei dizer se é bug no Management Studio, eu mesmo já reproduzi os procedimentos que você fez e também tive os mesmos comportamentos.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quinta-feira, 26 de julho de 2012 16:01