A partir do erro de atualização de execução do MySQL ERRO 1292

157202a8d942e29df0356f05d93f000a.gif

Autor | JiekeXu

Fonte|Conta pública JiekeXu DBA Road (ID: JiekeXu_IT)

Se precisar reimprimir, entre em contato para obter autorização | (ID pessoal do WeChat: JiekeXu_DBA)

Olá a todos, sou JiekeXu. Estou muito feliz em conhecê-los novamente. Hoje, darei uma olhada na atualização de execução do MySQL e relatarei o erro ERROR 1292. Por favor, clique na palavra azul "JiekeXu DBA Road" acima para seguir minha conta oficial , estrela ou alfinete no topo, mais produtos secos chegarão o mais rápido possível!

A coisa é assim, quando usei a ferramenta automatizada para executar o SQL escrito pelo desenvolvedor antes do trabalho na última sexta-feira, a ferramenta automatizada falhou ao executar, então fui manualmente para o ambiente de produção para executá-la e ocorreu um erro "ERRO 1292 (22007): Truncated incorrect DOUBLE value" para truncar o valor DOUBLE incorreto . É porque o comprimento do tipo de dados não é suficiente? Em seguida, vamos verificar a estrutura da tabela.

mysql> update t_busi_cont set busi_contract_file='ba42cfdb-a1d0-4e5a-c'  and busi_contract_file_ct=1 
    -> where id='7823dcaade9145cdb8702d537';
ERROR 1292 (22007): Truncated incorrect DOUBLE value: 'ba42cfdb-a1d0-4e5a-c'




mysql> select busi_contract_file,busi_contract_file_ct from t_busi_cont where id='7823dcaade9145cdb8702d537';
+------------------------------------------------+-----------------------+
| busi_contract_file                             | busi_contract_file_ct |
+------------------------------------------------+-----------------------+
| undefined,ba42cfdb-a1d0-4e5a-c                 |                     2 |
+------------------------------------------------+-----------------------+

Observando a estrutura da tabela, não há nada de errado com esses dois tipos de campo, tipo de caractere e tipo inteiro, e varchar(4000). . . . . .

mysql> show create table t_busi_cont;
CREATE TABLE `t_busi_cont` (
  `sequence_no` int(18) NOT NULL AUTO_INCREMENT COMMENT '顺序号',
  `id` varchar(36) COLLATE utf8mb4_bin NOT NULL COMMENT '合同明细编号',
  `busi_contract_file` varchar(4000) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '合同文件编号,逗号分隔',
  `busi_contract_file_ct` int(10) NOT NULL DEFAULT '0' COMMENT '合同文件张数',
  ……省去其他字段……
  PRIMARY KEY (`sequence_no`),
  UNIQUE KEY `u_t_ar_busi_contract_01` (`id`),
  );

Em seguida, use a ferramenta de visualização do lado do cliente e a linha de comando do Xshell para executar o mesmo erro. Não há outro jeito. Vamos atualizar separadamente de acordo com a lógica SQL. A atualização separada de acordo com as condições é considerada um sucesso. Não fiz pensei que é um problema de gramática até aqui. . . . . .

mysql> update t_busi_cont set busi_contract_file='ba42cfdb-a1d0-4e5a-c' where id='7823dcaade9145cdb8702d537';
Query OK, 1 row affected (25.12 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.01 sec)
mysql> update t_busi_cont set busi_contract_file_ct=1  where id='7823dcaade9145cdb8702d537';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.01 sec)

Na etapa de verificação, não queria entender por um tempo, então encontrei um ambiente de teste e simulei a lógica de atualização. Conforme mostrado abaixo, a atualização foi bem-sucedida. Mas, a julgar pelos resultados da atualização abaixo, apenas atualizar o valor de id=1 para 0 não atualiza a coluna c para 6, o que não é o esperado. Se você deseja atualizar os valores de várias colunas, não pode usar AND, pode usar vírgulas para separá-las. Embora o erro seja devido à sintaxe da cláusula, a descrição do erro do MySQL também me leva a pensar que há um problema com o valor. Uma das razões para acionar esse erro é que a cláusula AND é usada ao atualizar várias colunas de a tabela sem usar vírgulas para separar várias colunas. .

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 48
Server version: 8.0.28 MySQL Community Server - GPL


Copyright (c) 2000, 2022, Oracle and/or its affiliates.


Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql> select * from t;
+----+------+------+
| id | c    | d    |
+----+------+------+
|  1 |    1 |    1 |
|  2 |    2 |    2 |
|  3 |    3 |    3 |
|  4 |    4 |    4 |
|  5 |    5 |    4 |
+----+------+------+
5 rows in set (0.00 sec)


mysql> update t set id=6 and c=6 where d=1;    ----AND 连接
Query OK, 1 row affected (0.06 sec)
Rows matched: 1  Changed: 1  Warnings: 0


mysql> select * from t;
+----+------+------+
| id | c    | d    |
+----+------+------+
|  0 |    1 |    1 |
|  2 |    2 |    2 |
|  3 |    3 |    3 |
|  4 |    4 |    4 |
|  5 |    5 |    4 |
+----+------+------+
5 rows in set (0.00 sec)


mysql> update t set id=6,c=6 where d=1;  ----使用逗号分隔
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0


mysql> select * from t;
+----+------+------+
| id | c    | d    |
+----+------+------+
|  2 |    2 |    2 |
|  3 |    3 |    3 |
|  4 |    4 |    4 |
|  5 |    5 |    4 |
|  6 |    6 |    1 |
+----+------+------+
5 rows in set (0.00 sec)

58c1e50786bf5494399bb1c5ec0f52e0.png

No teste mostrado acima, "update t set id=6 e c=6 where d=1;" realmente deu certo, mas há um problema, você não sabe se já pensou nisso, por que o valor é atualizado para 0? Você pode pensar sobre isso primeiro. Se você não consegue pensar nisso por enquanto, pode continuar a olhar para a imagem abaixo.

de32a41699d53f23e944fe1d4bf1f12e.png

Você vê claramente? Na figura acima, "update t set id='6' and c='6' where d=1;" e "update t set id='6' and c='1' where d=1;" são executados com sucesso, mas o valor da atualização com sucesso é diferente, a frente é 1 e a parte de trás é 0, você pensa nisso agora? 0, 1, 0, 1 Isso não é um valor booleano? No MySQL, o otimizador trata a cláusula entre "set id=" e where como um valor, e o resultado de '6' e c='6' é It é considerado verdadeiro, então é atualizado para id=1, o resultado de '6' e c='1' é considerado falso, então é atualizado para id=0 (mas ainda não entendo porque é esse resultado, se alguém ver, pode me dar uma lição), mas no ambiente de produção, o tipo de dados errado na imagem abaixo não corresponde e um erro é relatado, mas essa mensagem de erro é um pouco confusa.

2e950d26bcdd049ca424556306789b94.png

Em meu ambiente de teste Oracle 23c, simulei a operação acima, e ao executar este SQL diretamente, foi reportado um erro, sendo a operação inválida ORA-00920.

Connected to:
Oracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release
Version 23.2.0.0.0


SQL> CREATE TABLE JiekeXu.t1 (
  2    id int NOT NULL,
  3    c int DEFAULT NULL,
  4    d int DEFAULT NULL,
  5    PRIMARY KEY (id)
  6  );


Table created.


SQL> insert into JiekeXu.t1 values(1,1,1),(2,2,2),(3,3,3);    ----23c 新特性允许一次性插入多行值


3 rows created.


SQL> commit;


Commit complete.


SQL> select * from JiekeXu.t1;


        ID          C          D
---------- ---------- ----------
         1          1          1
         2          2          2
         3          3          3


SQL> update JiekeXu.t1 set id=6 and c=6 where d=1;
update JiekeXu.t1 set id=6 and c=6 where d=1
                           *
ERROR at line 1:
ORA-00920: invalid relational operator




SQL> update JiekeXu.t1 set id=6,c=6 where d=1;
1 row updated.

bf213a62032a4c99fa806b29d15574e5.png

Em seguida, também testei que a versão do PostgreSQL 14 também relatará um erro diretamente, e a mensagem de erro é muito óbvia ERROR:argument of AND deve ser do tipo boolean, não do tipo integer , AND deve ser seguido por um tipo boolean em vez de um integer tipo.

73955c42b9ff7ce69ff46a4570cdc2de.png

$ psql
psql (14.1)
Type "help" for help.
postgres=# \c jiekexu
You are now connected to database "jiekexu" as user "postgres".
jiekexu=# \dt 
             List of relations
 Schema |     Name      | Type  |  Owner   
--------+---------------+-------+----------
 public | t             | table | postgres
 public | t1            | table | postgres
 public | t_analyzeplan | table | postgres
(3 rows)


jiekexu=# CREATE TABLE test (
jiekexu(#       id int NOT NULL,
jiekexu(#       c int DEFAULT NULL,
jiekexu(#       d int DEFAULT NULL,
jiekexu(#       PRIMARY KEY (id)
jiekexu(#     );
CREATE TABLE
jiekexu=# insert into test values(1,1,1),(2,2,2),(3,3,3);
INSERT 0 3
jiekexu=# 
jiekexu=# select * from test;
 id | c | d 
----+---+---
  1 | 1 | 1
  2 | 2 | 2
  3 | 3 | 3
(3 rows)


jiekexu=#  update test set id=6 and c=6 where d=1;
ERROR:  argument of AND must be type boolean, not type integer
LINE 1: update test set id=6 and c=6 where d=1;
                           ^
jiekexu=# show server_version;
 server_version 
----------------
 14.1
(1 row)

40a293685a83834f0aa563164e718773.png

O texto completo está pronto, espero que possa ajudar você que está lendo, se você acha que este artigo é útil para você, pode compartilhar com seus amigos, colegas, quem você gosta, e compartilhar com quem você gosta, vamos aprender juntos e progredir~~~

Bem-vindo a seguir minha conta oficial [JiekeXu DBA Road] e aprender novos conhecimentos juntos o mais rápido possível! Você pode me encontrar nos três endereços a seguir. Os outros endereços pertencem à violação de direitos autorais pirata que rastreia meus artigos, e o formato do código, as imagens etc. são desordenados, o que é inconveniente de ler. Bem-vindo à minha conta oficial ou endereço Motianlun a seguir mim, e obtenha as últimas atualizações o mais rápido possível.

————————————————————————————————
Conta pública: JiekeXu DBA Road
CSDN: https://blog.csdn.net/
Roda JiekeXu Motian: https://www.modb.pro/u/4347
———————————————————————————————

1212dbcc0b5d69618025af28c9833b74.gif

Compartilhe vários scripts de backup de banco de dados

Verificação de fragmentação de tabela Oracle e esquema de desfragmentação

OGG|Oracle GoldenGate 基础2022 年公众号历史文章合集整理
 
  

Vários problemas encontrados pelo Oracle 19c RAC

OGG|Oracle 数据迁移后比对一致性

Arquitetura de Microsserviços OGG|Oracle GoldenGate

O uso do espaço de tabela de consulta do Oracle é extremamente lento

Banco de dados doméstico | Primeira experiência de instalação rápida autônoma do TiDB 5.4

Processo de manutenção de desligamento do banco de dados em espera do Oracle ADG e recuperação incremental

Ambiente Linux para construir ambiente de sincronização mestre-escravo MySQL8.0.28

bb5d1f0f8c0856d6055aeade49b23366.png

Acho que você gosta

Origin blog.csdn.net/JiekeXu/article/details/131651113
Recomendado
Clasificación