Trois conseils pour vous apprendre à résoudre le piège des caractères de largeur nulle et à rendre votre base de données plus « hantée ».
Auteur : Qin Fulang, membre de l'équipe DBA d'Aikesheng, responsable de la gestion des problèmes quotidiens du projet et du dépannage des problèmes de la plate-forme de l'entreprise. Un DBA qui aime Internet, connaît la photographie et connaît les compétences culinaires n'est pas un bon conducteur, didi~
Produit par la communauté open source Aikeson, le contenu original ne peut être utilisé sans autorisation. Veuillez contacter l'éditeur et indiquer la source de réimpression.
Cet article compte environ 1 000 mots et devrait prendre 3 minutes à lire.
introduction
Dans le processus d'utilisation de MySQL, parfois un petit personnage peut causer de gros problèmes. Avant de découvrir la vérité, je pensais que le problème était causé par un fantôme. Mais quand j'ai découvert la vérité, je ne m'attendais pas à ce qu'il soit causé par un seul. Le problème est que les caractères de largeur nulle sont comme un fantôme caché dans tous les aspects de l'industrie informatique. Aujourd'hui, je vais partager un cas récurrent de "tables disparues" dans MySQL.
Description du problème
test
Une table nommée est créée dans la base de données par certains moyens (tels qu'une ligne de commande ou des outils de développement de base de données, etc.) lang
. La structure du tableau est la suivante :
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;
Grâce à SHOW TABLES;
la commande, nous pouvons confirmer l'existence de cette table.
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| a1 |
| lang |
| t1 |
| z1 |
+----------------+
4 rows in set (0.00 sec)
Cependant, lorsque vous essayez d'exécuter une requête ou un programme métier sur le client MySQL SELECT * FROM lang;
pour vous connecter à la table, vous recevez un message d'erreur :
mysql> select * from lang;
ERROR 1146 (42S02): Table 'test.lang' doesn't exist
La montre a disparu comme par magie.
Analyse des causes
C'est comme voir un fantôme Même si vous saisissez manuellement la syntaxe de requête plusieurs fois, vous ne pouvez pas interroger cette table. Nous copions l'instruction de création de tableau dans l'outil texte Sublime Text :
C'est à ce moment-là que nous avons découvert le problème : le nom de la table était suivi d'un caractère "<0×200b>". Il s'agit d'un espace de largeur nulle, qui est un type de caractère de largeur nulle.
Que sont les caractères de largeur nulle ?
Un caractère de largeur nulle est un caractère Unicode spécial qui n'occupe aucun espace visible et est donc invisible dans la plupart des situations. Cependant, ils peuvent exister sous forme de texte et avoir un impact sur les programmes informatiques, notamment les systèmes de gestion de bases de données. En Unicode, U+200B signifie espace de largeur nulle et est souvent utilisé là où des sauts de ligne peuvent être nécessaires. De plus, il existe d'autres caractères de largeur nulle, qui ne seront pas décrits ici.
Alors pourquoi ce personnage fantomatique existe-t-il ? Les soi-disant moyens d'existence raisonnables. Les caractères de largeur nulle sont souvent utilisés dans des scénarios tels que l'anti-exploration de données, la transmission d'informations cryptées et la prévention de l'analyse de mots sensibles. Mais lorsqu’il est utilisé dans un système de base de données, il y aura parfois des maux de tête, et celui mentionné dans cet article en fait partie. Bien que ces caractères n'occupent pas d'espace, ils peuvent détruire la structure correcte de la commande SQL et provoquer des erreurs lors des utilisations ultérieures.
Comment résoudre?
- Avant de créer un tableau, copiez l'instruction de création de tableau dans plusieurs outils d'édition de texte et vérifiez s'il existe des invites de symboles anormales (les outils de texte généraux peuvent ne pas être en mesure d'afficher des caractères de largeur nulle). Après avoir essayé des outils ou des plug-ins tels que Sublime Text et Visual Studio Code, ils ont pour fonction de rappeler les caractères de largeur nulle ; il existe également des outils Web en ligne qui permettent d'afficher les caractères Unicode ; Si vous connaissez d'autres outils capables d'afficher des caractères de largeur nulle, veuillez laisser un message dans la zone de commentaires pour les partager.
- Après avoir créé le tableau, utilisez
SHOW CREATE TABLE;
la commande pour afficher la structure du tableau, puis copiez la sortie dans l'outil d'édition de texte ci-dessus pour vérifier s'il existe des symboles anormaux. - Après de nombreux tests, il a été constaté que lorsque la commande était exécutée sur le client MySQL , la ligne de bordure "|"
SHOW TABLES;
derrière le nom de la table contenant des espaces de largeur nulle n'était pas alignée avec les autres lignes. Cela permet une découverte rapide des tables problématiques, mais n'affiche pas de caractères spécifiques. Bien entendu, cette méthode ne s’applique généralement pas aux outils de développement tiers, aux programmes commerciaux, etc.
Résumer
Les caractères de largeur nulle sont un piège invisible qui peut causer des problèmes apparemment insolubles lors de l'utilisation de MySQL. En comprenant leur nature, en revérifiant les commandes SQL, en évitant les copier-coller à partir de sources peu fiables, en utilisant les outils appropriés et en suivant les meilleures pratiques, nous pouvons garantir que notre base de données fonctionne correctement et qu'aucun problème similaire ne survienne.
Pour des articles plus techniques, veuillez visiter : https://opensource.actionsky.com/
À propos de SQLE
SQLE est une plateforme complète de gestion de la qualité SQL qui couvre l'audit et la gestion SQL, du développement aux environnements de production. Il prend en charge les bases de données open source, commerciales et nationales grand public, fournit des capacités d'automatisation des processus pour le développement, l'exploitation et la maintenance, améliore l'efficacité en ligne et améliore la qualité des données.
SQLE obtenir
taper | adresse |
---|---|
Dépôt | https://github.com/actiontech/sqle |
document | https://actiontech.github.io/sqle-docs/ |
publier des nouvelles | https://github.com/actiontech/sqle/releases |
Documentation de développement du plug-in d'audit des données | https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse |