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:
Voici la requête de résultat sans guillemets simples:
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 >
4 Réponses :
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 | | -------------------------------- | | %~!@#$%^&*()_+|}{":?><./';[]=-`% |
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?
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 = .
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 '%~!@#$\%^&*()\_+|}{":?><./'';[]\\\\=-`%';
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.
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 = ~! @ # $% ^ & * () _ + |} {":?> <.>
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.