A tabela MySQL desaparece misteriosamente após ser criada? Descobrindo a armadilha de caracteres de largura zero

Três dicas para te ensinar como resolver a armadilha de caracteres de largura zero e fazer com que seu banco de dados não seja mais “assombrado”.

Autor: Qin Fulang, membro da equipe de DBA da Aikesheng, responsável por lidar com problemas diários de projetos e solucionar problemas de plataforma da empresa. Um DBA que adora a Internet, conhece fotografia e sabe cozinhar não é um bom motorista, didi ~

Produzido pela comunidade de código aberto Aikeson, o conteúdo original não pode ser utilizado sem autorização. Entre em contato com o editor e indique a fonte para reimpressão.

Este artigo tem cerca de 1.000 palavras e deve levar 3 minutos para ser lido.

introdução

No processo de uso do MySQL, às vezes um pequeno caractere pode causar grandes problemas. Antes de descobrir a verdade, pensei que o problema fosse causado por um fantasma, mas quando descobri a verdade, não esperava que fosse causado por um único. personagem. O problema é que caracteres de largura zero são como um fantasma escondido em todos os aspectos da indústria de TI. Hoje compartilharei um caso recorrente de "tabelas desaparecendo" no MySQL.

Descrição do Problema

testUma tabela nomeada é criada no banco de dados por meio de alguns meios (como linha de comando ou ferramentas de desenvolvimento de banco de dados, etc.) lang. A estrutura da tabela é a seguinte:

CREATE TABLE `lang​` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Através SHOW TABLES;do comando podemos confirmar a existência desta tabela.

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| a1             |
| lang​          |
| t1             |
| z1             |
+----------------+
4 rows in set (0.00 sec)

Porém, ao tentar executar uma consulta ou programa de negócios no cliente MySQL SELECT * FROM lang;para se conectar à tabela, você recebe uma mensagem de erro:

mysql> select * from lang;
ERROR 1146 (42S02): Table 'test.lang' doesn't exist

O relógio simplesmente desapareceu magicamente.

Análise de causa

É como ver um fantasma. Mesmo se você inserir manualmente a sintaxe da consulta muitas vezes, não poderá consultar esta tabela. Copiamos a instrução de criação da tabela na ferramenta de texto Sublime Text:

Neste momento, descobrimos o problema: o nome da tabela era seguido por um caractere “<0×200b>”. Este é um espaço de largura zero, que é um tipo de caractere de largura zero.

O que são caracteres de largura zero?

Um caractere de largura zero é um caractere Unicode especial que não ocupa nenhum espaço visível e, portanto, é invisível na maioria das situações. No entanto, eles podem existir em texto e ter impacto em programas de computador, incluindo sistemas de gerenciamento de banco de dados. Em Unicode, U+200B significa espaço de largura zero e é frequentemente usado onde quebras de linha podem ser necessárias. Além disso, existem outros caracteres de largura zero, que não serão descritos aqui.

Então, por que existe esse personagem fantasma? A chamada existência significa razoável. Caracteres de largura zero são frequentemente usados ​​em cenários como anti-rastreamento de dados, transmissão de informações criptografadas e prevenção de verificação de palavras confidenciais. Mas quando usado em um sistema de banco de dados, às vezes haverá dores de cabeça, e a mencionada neste artigo é uma delas. Embora esses caracteres não ocupem espaço, eles podem destruir a estrutura correta do comando SQL e causar erros em usos subsequentes.

Como resolver?

  1. Antes de criar uma tabela, copie a instrução de criação de tabela para várias ferramentas de edição de texto e verifique se há algum prompt de símbolo anormal (as ferramentas de texto gerais podem não conseguir exibir caracteres de largura zero). Depois de experimentar ferramentas ou plug-ins como Sublime Text e Visual Studio Code, eles têm a função de lembrar caracteres de largura zero, existem também algumas ferramentas online da web que podem visualizar caracteres Unicode; Se você conhece outras ferramentas que podem exibir caracteres de largura zero, deixe uma mensagem na área de comentários para compartilhar.
  2. Depois de criar a tabela, use SHOW CREATE TABLE;o comando para visualizar a estrutura da tabela e, em seguida, copie a saída para a ferramenta de edição de texto acima para verificar se há algum símbolo anormal.
  3. Após muitos testes, descobriu-se que quando o comando foi executado no cliente MySQL , a linha de borda "|"SHOW TABLES; atrás do nome da tabela contendo espaços de largura zero não estava alinhada com outras linhas. Isto permite a descoberta rápida de tabelas problemáticas, mas não exibe caracteres específicos. Obviamente, esse método geralmente não se aplica a ferramentas de desenvolvimento de terceiros, programas de negócios, etc.

Resumir

Caracteres de largura zero são uma armadilha invisível que pode causar alguns problemas aparentemente insolúveis durante o uso do MySQL. Ao compreender sua natureza, verificar novamente os comandos SQL, evitar copiar e colar de fontes não confiáveis, usar ferramentas apropriadas e seguir as práticas recomendadas, podemos garantir que nosso banco de dados funcione sem problemas e que não surjam problemas semelhantes.

Para mais artigos técnicos, visite: https://opensource.actionsky.com/

Sobre SQLE

SQLE é uma plataforma abrangente de gerenciamento de qualidade de SQL que cobre auditoria e gerenciamento de SQL desde o desenvolvimento até ambientes de produção. Ele oferece suporte aos principais bancos de dados de código aberto, comerciais e domésticos, fornece recursos de automação de processos para desenvolvimento, operação e manutenção, melhora a eficiência on-line e melhora a qualidade dos dados.

Obter SQLE

tipo endereço
Repositório https://github.com/actiontech/sqle
documento https://actiontech.github.io/sqle-docs/
lançar notícias https://github.com/actiontech/sqle/releases
Documentação de desenvolvimento de plug-in de auditoria de dados https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse
Linus assumiu a responsabilidade de evitar que os desenvolvedores do kernel substituíssem tabulações por espaços. Seu pai é um dos poucos líderes que sabe escrever código, seu segundo filho é o diretor do departamento de tecnologia de código aberto e seu filho mais novo é um núcleo de código aberto. contribuidor Robin Li: A linguagem natural se tornará uma nova linguagem de programação universal. O modelo de código aberto ficará cada vez mais atrás da Huawei: levará 1 ano para migrar totalmente 5.000 aplicativos móveis comumente usados ​​para Hongmeng. vulnerabilidades de terceiros. O editor de rich text Quill 2.0 foi lançado com recursos, confiabilidade e desenvolvedores. A experiência foi bastante melhorada. fonte de Laoxiangji não é o código, as razões por trás disso são muito comoventes. O Google anunciou uma reestruturação em grande escala.
{{o.nome}}
{{m.nome}}

Acho que você gosta

Origin my.oschina.net/actiontechoss/blog/11053596
Recomendado
Clasificación