¿La tabla MySQL desaparece misteriosamente después de ser creada? Descubriendo la trampa del personaje de ancho cero

Tres consejos para enseñarte cómo resolver la trampa de los caracteres de ancho cero y hacer que tu base de datos ya no esté "embrujada".

Autor: Qin Fulang, miembro del equipo de DBA de Aikesheng, responsable de manejar los problemas diarios del proyecto y solucionar los problemas de la plataforma de la empresa. Un DBA que ama Internet, sabe fotografía y sabe cocinar no es un buen conductor, didi ~

Producido por la comunidad de código abierto de Aikeson, el contenido original no se puede utilizar sin autorización. Comuníquese con el editor e indique la fuente para la reimpresión.

Este artículo tiene aproximadamente 1000 palabras y se espera que demore 3 minutos en leerlo.

introducción

En el proceso de uso de MySQL, a veces un carácter pequeño puede causar grandes problemas. Antes de descubrir la verdad, pensé que el problema era causado por un fantasma, pero cuando descubrí la verdad, no esperaba que fuera causado por un solo personaje. El problema es que los caracteres de ancho cero son como un fantasma escondido en todos los aspectos de la industria de TI. Hoy compartiré un caso recurrente de "tablas que desaparecen" en MySQL.

Descripción del problema

testUna tabla denominada se crea en la base de datos a través de algún medio (como línea de comandos o herramientas de desarrollo de bases de datos, etc.) lang. La estructura de la tabla es la siguiente:

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;

A través SHOW TABLES;del comando podemos confirmar la existencia de esta tabla.

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

Sin embargo, cuando intenta ejecutar una consulta o un programa comercial en el cliente MySQL SELECT * FROM lang;para conectarse a la tabla, recibe un mensaje de error:

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

El reloj desapareció mágicamente.

Análisis de causa

Es como ver un fantasma. Incluso si ingresa manualmente la sintaxis de consulta muchas veces, no podrá consultar esta tabla. Copiamos la declaración de creación de la tabla en la herramienta de texto Sublime Text:

En ese momento, descubrimos el problema: el nombre de la tabla iba seguido del carácter "<0×200b>". Este es un espacio de ancho cero, que es un tipo de carácter de ancho cero.

¿Qué son los caracteres de ancho cero?

Un carácter de ancho cero es un carácter Unicode especial que no ocupa ningún espacio visible y, por tanto, es invisible en la mayoría de situaciones. Sin embargo, pueden existir en texto y pueden tener un impacto en los programas informáticos, incluidos los sistemas de gestión de bases de datos. En Unicode, U+200B significa espacio de ancho cero y se utiliza a menudo cuando se necesitan saltos de línea. Además, hay otros caracteres de ancho cero que no se describirán aquí.

Entonces, ¿por qué existe este personaje fantasmal? La llamada existencia significa razonable. Los caracteres de ancho cero se utilizan a menudo en escenarios como el antirastreo de datos, la transmisión de información cifrada y la prevención del escaneo de palabras confidenciales. Pero cuando se usa en un sistema de base de datos, a veces habrá dolores de cabeza, y el mencionado en este artículo es uno de ellos. Aunque estos caracteres no ocupan espacio, pueden destruir la estructura correcta del comando SQL y provocar errores en usos posteriores.

¿Cómo resolver?

  1. Antes de crear una tabla, copie la declaración de creación de la tabla en varias herramientas de edición de texto y verifique si hay mensajes de símbolos anormales (es posible que las herramientas de texto generales no puedan mostrar caracteres de ancho cero). Después de probar herramientas o complementos como Sublime Text y Visual Studio Code, tienen la función de recordar caracteres de ancho cero. También existen algunas herramientas web en línea que pueden ver caracteres Unicode; Si conoce otras herramientas que pueden mostrar caracteres de ancho cero, deje un mensaje en el área de comentarios para compartir.
  2. Después de crear la tabla, use SHOW CREATE TABLE;el comando para ver la estructura de la tabla y luego copie el resultado a la herramienta de edición de texto anterior para verificar si hay símbolos anormales.
  3. Después de muchas pruebas, se descubrió que cuando se ejecutó el comando en el cliente MySQL , la línea de borde "|"SHOW TABLES; detrás del nombre de la tabla que contiene espacios de ancho cero no estaba alineada con otras líneas. Esto permite el descubrimiento rápido de tablas problemáticas, pero no muestra caracteres específicos. Por supuesto, este método generalmente no se aplica a herramientas de desarrollo de terceros, programas comerciales, etc.

Resumir

Los caracteres de ancho cero son una trampa invisible que puede causar algunos problemas aparentemente irresolubles durante el uso de MySQL. Al comprender su naturaleza, verificar los comandos SQL, evitar copiar y pegar de fuentes no confiables, utilizar herramientas adecuadas y seguir las mejores prácticas, podemos asegurarnos de que nuestra base de datos funcione sin problemas y no surjan problemas similares.

Para obtener más artículos técnicos, visite: https://opensource.actionsky.com/

Acerca de SQLE

SQLE es una plataforma integral de gestión de calidad de SQL que cubre la auditoría y gestión de SQL desde los entornos de desarrollo hasta los de producción. Admite bases de datos nacionales, comerciales y de código abierto convencionales, proporciona capacidades de automatización de procesos para el desarrollo, operación y mantenimiento, mejora la eficiencia en línea y mejora la calidad de los datos.

obtener SQLE

tipo DIRECCIÓN
Repositorio https://github.com/actiontech/sqle
documento https://actiontech.github.io/sqle-docs/
noticias de lanzamiento https://github.com/actiontech/sqle/releases
Documentación de desarrollo del complemento de auditoría de datos https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse
Linus se encargó de evitar que los desarrolladores del kernel reemplazaran las pestañas con espacios. Su padre es uno de los pocos líderes que puede escribir código, su segundo hijo es el director del departamento de tecnología de código abierto y su hijo menor es un núcleo de código abierto. Colaborador Robin Li: El lenguaje natural se convertirá en un nuevo lenguaje de programación universal. El modelo de código abierto se quedará cada vez más atrás de Huawei: tomará 1 año migrar completamente 5,000 aplicaciones móviles de uso común a Hongmeng, que es el lenguaje más propenso. Vulnerabilidades de terceros. Se lanzó el editor de texto enriquecido Quill 2.0 con características, confiabilidad y experiencia de desarrolladores que Ma Huateng y Zhou Hongyi se dieron la mano para "eliminar los rencores". La fuente de Laoxiangji no es el código, las razones detrás de esto son muy conmovedoras. Google anunció una reestructuración a gran escala.
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

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