AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 180456
Accepted
Nishant
Nishant
Asked: 2017-07-22 06:34:23 +0800 CST2017-07-22 06:34:23 +0800 CST 2017-07-22 06:34:23 +0800 CST

Salvando em um erro de lançamento de VARCHAR (MAX) em alguns cenários

  • 772

Estamos percebendo um erro como este:

InterfaceError: ('HY104', 0, '[Microsoft][SQL Server Native Client 11.0]
Invalid precision value', 10226)

Isso acontece quando inserimos um determinado comprimento de caracteres junto com o conteúdo Unicode como \u3000( Espaço ideográfico ). Isso acontece apenas quando estamos usando o Driver MSSQL do Windows e a consulta é parametrizada.

A coluna é um VARCHAR(MAX). Portanto, deve suportar 2 GB.

  • Qual poderia ser a razão para isso?
  • Por que esse comprimento importa?

Se eu apenas inserir esse caractere Unicode sozinho, isso não causará problemas!

Eu estava tentando ver isso de um ponto de vista teórico. Mudar para NVARCHARnão é uma opção para nós atualmente, mas remover o Unicode é.

Aqui estão mais alguns detalhes de acordo com as perguntas feitas por Solomon Rutzky:

  1. O agrupamento de colunas éSQL_Latin1_General_CP1_CI_AS
  2. O comprimento da string em que começo a ver o erro é 4019.
  3. sqlalchemy.connectors.mxodbc, line 86, in error_handleré onde recebo o erro inicial. Isso é do rastreamento.
  4. Funciona bem com um único caractere Unicode.
  5. Uma string de 20.000 caracteres sem Unicode funciona bem.
  6. Faz com que seja ASCII quando tento isso neste software (Web App). Testei no Dbeaver exportando os dados.
sql-server windows
  • 1 1 respostas
  • 3048 Views

1 respostas

  • Voted
  1. Best Answer
    Solomon Rutzky
    2017-07-22T08:44:40+08:002017-07-22T08:44:40+08:00

    Ajudaria muito saber:

    1. o agrupamento atual da coluna VARCHAR(MAX)
    2. o comprimento exato da string (em bytes) em que você começa a ver o erro
    3. Qual software está relatando esse erro?
    4. O erro ocorre se apenas um único caractere Unicode estiver presente?
    5. Uma cadeia de 10.000 caracteres sem caracteres Unicode é inserida corretamente?
    6. Para uma string curta o suficiente que é inserida sem erro, mas contém um desses caracteres Unicode, qual valor exatamente está na tabela? Você pode verificar convertendo a coluna para VARBINARY(MAX). O caractere Unicode foi traduzido ou algo mais?

    É possível que a string que apresenta erros esteja um pouco acima de um limite de 4.000 ou 8.000 caracteres que requer o uso de um MAXtipo e o driver está inicialmente adivinhando (ou sendo informado) que é um tamanho e depois descobre que é outro. A mensagem de erro diz "valor de precisão inválido", que deve estar se referindo a como a coluna está sendo configurada (ou seja, semelhante a configurar um SqlParameterem .NET e declarar o tamanho máximo, como new SqlParameter("@name", SqlDbType.VarChar, 8000)). Portanto, esse tipo de erro só deve realmente acontecer se o software estiver tentando configurar a coluna VARCHARacima de 8.000 ou NVARCHARacima de 4.000, pois qualquer uma dessas condições seria uma "precisão" inválida. Agora, para obter esse número, suspeito que algum código esteja contando o número de bytes (ou seja,DATALENGTH) da string, que será maior que o número de caracteres. Claro, isso seria verdade para qualquer caractere em um .NET stringou C++ wchar, então estou suspeitando que a diferença de ter alguns caracteres Unicode versus não ter nenhum é que, sem nenhum caractere Unicode, ele pode converter a string em uma codificação de 8 bits (ou seja, byte único para uso com VARCHAR), mas de alguma forma ter um caractere Unicode impede isso. É um tiro no escuro (até que haja mais informações fornecidas), mas é bastante claro onde o erro está ocorrendo.

    Se eu apenas inserir o caractere sozinho, não causará um problema.

    Como você está inserindo o personagem? Através do mesmo software que está gerando o erro, ou no SSMS? Se você estiver fazendo isso manualmente por meio de uma INSERTinstrução, esse não é um bom teste, pois o SQL Server converte U+3000 em um espaço regular, U+0020 (um byte), em vez de dois pontos de interrogação (ainda 2 bytes, como faria acontecer se não houver caractere equivalente):

    SELECT N'-' + NCHAR(0x3000) + N'-',
           CONVERT(VARCHAR(MAX), N'-' + NCHAR(0x3000) + N'-'),
           CONVERT(VARBINARY(MAX), CONVERT(VARCHAR(MAX), N'-' + NCHAR(0x3000) + N'-'));
    

    retorna:

    - -    - -    0x2D202D
    

    Se possível, tente passar as duas strings geradas pelo código a seguir por meio do software, não por meio do SSMS:

    DECLARE @String4k NVARCHAR(MAX);
    SET @String4k = REPLICATE(N'a', 3999) + NCHAR(0x3000);
    SELECT LEN(@String4k);
    
    DECLARE @String8k NVARCHAR(MAX);
    SET @String8k = REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 7999);
    SET @String8k += NCHAR(0x3000);
    SELECT LEN(@String8k);
    

    A @String4kstring é de 3999 caracteres que podem ser convertidos de forma limpa em uma codificação de 8 bits (ou seja, VARCHAR) mais o caractere U+3000 que provavelmente permanecerá como 2 bytes. Então talvez isso apareça, através desse software, como 4001 caracteres. Duvido que seja esse o problema, mas não custa testar.

    A @String8kstring é de 7999 caracteres que podem ser convertidos de forma limpa em uma codificação de 8 bits (ou seja, VARCHAR) mais o caractere U+3000 que provavelmente permanecerá como 2 bytes. Então talvez isso apareça, através desse software, como 8001 caracteres.

    • 4

relate perguntas

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • O Oracle pode ser instalado no Windows sem ser um administrador?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve