1
votes

Le serveur MySQL version 10.3.9-MariaDB ne peut pas interroger le texte avec un guillemet simple

J'ai une base de données MySQL qui a un TagName classé avec la valeur ~! @ # $% ^ & * () _ + |} {":?> <. j la requ s tagname partir de taginfo o comme> Il montre les données avec le tagname contiennent un caractère de citation. Mais j'interroge avec l'opérateur = et l'opérateur like et j'ajoute plus de guillemets '' pour accepter les guillemets simples mais cela affiche un résultat vide.

J'essaie également d'ajouter COLLATE UTF8_GENERAL_CI ou de modifier CHARACTER SET mais tous ne réussissent pas. / p>

SELECT VERSION();

Version du serveur de base de données: MySQL 5.5.5 MariaDB Informations sur le tableau:  entrez la description de l'image ici

Voici la requête de résultat sans guillemets simples: entrez la description de l'image ici

Mise à jour: J'ai trouvé un problème que si je fais une requête sans caractère \ il affiche le résultat:

select * from taginfo1 where TagName = '~!@#$%^&*()_+|}{":?><./'';[]\\=-`';

Mais j'ai ajouté un caractère \ à la fin, il ne montre rien:

XXX

ajouter plus de splash ne fonctionne toujours pas

select * from taginfo1 where TagName = '~!@#$%^&*()_+|}{":?><./'';[]\\=-`';

Mise à jour: Le problème maintenant, la requête similaire renvoie le résultat mais la requête = n'en renvoie aucun.

SELECT * from taginfo where tagname like '%~!@#$%^&*()_+|}{":?><./'';[]\\=-`%';
select * from taginfo where TagName =     '~!@#$%^&*()_+|}{":?><./'';[]\\=-`'

Mise à jour: Lorsque j'essaie de créer une base de données dans MySQL 8.0.13, cette requête fonctionne bien et renvoie 1 ligne

select TagName from taginfo where TagName like '%~!@#$%^&*()_+|}{":?><./'';[]\\%';

Mais dans 10.3.9-MariaDB, la requête

XXX

ne peut renvoyer aucun résultat.

select TagName from taginfo where TagName like '%~!@#$%^&*()_+|}{":?><./'';[]\%';

10.3.9-MariaDB

p >


8 commentaires

que diriez-vous d'échapper deux guillemets simples au milieu avant ;


parce que le texte n'a qu'une citation, j'ajoute plus de citation à mysql l'accepte


Veuillez nous montrer les données réelles que vous essayez de faire correspondre. Ce que vous essayez de faire ici n'est pas clair.


@danblack Deux guillemets simples littéraux sont des guillemets simples échappés et ne doivent pas interrompre la requête.


Copie possible de Comment rechercher une barre oblique (\ ‌) dans MySQL? et pourquoi l'échappement (\ ‌) n'est pas obligatoire pour where (=) mais pour Like est obligatoire?


Pas de duplication, j'ai vérifié ce lien avant


Votre requête SELECT * depuis taginfo où le nom de variable comme '% ~! @ # $% ^ & * () _ + |} {":?> <./' '; [] \\ = -`%'; est incorrect. Vous devez échapper% et _ sinon ces caractères «correspondent» à quelque chose que vous ne vous attendez peut-être pas.


Je ne pense pas qu'une modification de la COLLATION changera les résultats pour cette chaîne. COLLATION s'applique principalement aux comparaisons de lettres, en particulier les lettres accentuées.


4 Réponses :


0
votes

La barre oblique inverse est un caractère d'échappement dans MySQL. Vous devrez le double échapper, comme \\ . De plus, si vous utilisez une condition LIKE , le signe de pourcentage et le trait de soulignement doivent également être échappés (sinon vous migrez la correspondance sur des valeurs non pertinentes).

Vous pouvez voir ce qui se passe en sélectionnant simplement le valeur que vous passez:

SELECT '%~!@#$\%^&*()\_+|}{":?><./'';[]\\=-`%' test2;

| test2                             |
| --------------------------------- |
| %~!@#$%^&*()_+|}{":?><./';[]\=-`% |

La seule barre oblique inverse disparaît tout simplement. MySQL pense qu'il est là pour échapper à quelque chose, mais comme le caractère suivant ( = ) n'est pas en fait un caractère spécial, il ne se passe plus rien.

Maintenant, échappons deux fois à la backslah, et il apparaît dans la sortie:

SELECT '%~!@#$\%^&*()_+|}{":?><./'';[]\=-`%' test1;

| test1                            |
| -------------------------------- |
| %~!@#$%^&*()_+|}{":?><./';[]=-`% |

Vue sur DB Fiddle


3 commentaires

J'essaye votre requête select * from taginfo where tagname = '% ~! @ # $% ^ & * () _ + |} {":?> <./' '; [] \\\ = -`%' mais ça ne marche pas


La même logique dit que le trait de soulignement ( _ ) doit être échappé.


Pouvez-vous m'aider avec un opérateur égal @GMB?



0
votes

J'essaie de définir

SELECT * from taginfo where tagname like '%~!@#$%^&*()_+|}{":?><./'';[]\\=-`%';

Et de mettre à jour la requête ajouter double \

SET @@SQL_MODE = CONCAT(@@SQL_MODE, ',NO_BACKSLASH_ESCAPES');

Cette requête renvoie le bon résultat mais ne fonctionne pas avec l'opérateur = .


0 commentaires

0
votes
DROP TABLE IF EXISTS `taginfo`;

CREATE TABLE `taginfo` (
    `tagname` VARCHAR(50) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;

-- Notice single quote and backslash are escaped:
INSERT INTO `taginfo` (`tagname`) VALUES   ('~!@#$%^&*()_+|}{":?><./'';[]\\=-`'); 
SELECT * FROM `taginfo` WHERE tagname =     '~!@#$%^&*()_+|}{":?><./'';[]\\=-`'; 

-- Notice single quote, percent and underscore are escaped and backslash escaped twice
SELECT * FROM `taginfo` WHERE tagname LIKE  '~!@#$\%^&*()\_+|}{":?><./'';[]\\\\=-`';
SELECT * FROM `taginfo` WHERE tagname LIKE '%~!@#$\%^&*()\_+|}{":?><./'';[]\\\\=-`%';

5 commentaires

Comme déjà recommandé, vous devez fournir vos données car vous avez mentionné différentes données dans différentes requêtes. Quelque part backstick au début, quelque part - à la fin. Cela peut être le problème lorsque vous essayez de copier / coller ma requête de sélection dans vos données. C'est pourquoi j'ai fourni drop / create / insert + 2 x select. Cela fonctionne sur mes 5.5.8, 5.7 et mariadb 10.1.14


Voici la valeur de la variable dans ma base de données ~! @ # $% ^ & * () _ + |} {":?> <./ '; [] \ = -`


J'ai mis à jour ma réponse avec vos données.


J'ai essayé la requête SELECT * FROM taginfo WHERE tagname = '~! @ # $% ^ & * () _ + |} {":?> <./' '; [] \\ = -` '; mais cela ne fonctionne pas, pouvez-vous m'aider avec un opérateur égal?


Êtes-vous sûr d'avoir la valeur exacte que vous avez fournie? Il peut s'agir d'espaces blancs de début ou de fin qui causent le «problème». Avez-vous essayé de copier / coller mon code? Créez une base de données de test sur votre serveur et exécutez le code «tel quel». Il renvoie les résultats pour les 2 sélections sur mes serveurs.



1
votes

Enfin, j'ai trouvé un problème car j'ai défini ce mode.

select * from taginfo where tagname = '~!@#$%^&*()_+|}{":?><./'';[]\\=-`'

et cette requête renvoie vide

select * from taginfo where tagname = '~!@#$%^&*()_+|}{":?><./'';[]\\=-`'

Lorsque je supprime le NO_BACKSLASH_ESCAPES par SET @@ SQL_MODE = 'NO_ENGINE_SUBSTITUTION';

SET @@SQL_MODE = CONCAT(@@SQL_MODE, ',NO_BACKSLASH_ESCAPES');

il renvoie une ligne avec tagname = ~! @ # $% ^ & * () _ + |} {":?> <.>


0 commentaires