J'essaye d'interroger une certaine ligne par nom dans ma base de données SQL et elle a une esperluette. J'ai essayé de définir un caractère d'échappement, puis d'échapper à l'esperluette, mais pour une raison quelconque, cela ne fonctionne pas et je ne sais pas exactement quel est mon problème.
Set escape '\'
select * from V1144engine.T_nodes where node_id in(
select node2_id from V1144engine.T_edges where node1_id in(
select node2_id from V1144engine.T_edges where node1_id in(
select node2_id from V1144engine.T_edges where node1_id =
(select node_id from V1144engine.T_nodes where node_name = 'Geometric Vectors \& Matrices')))
and edge_type_id = 1)
and node_type_id = 1
and node_id in (
select node2_id from V1144engine.T_edges where node1_id =
(select node_id from V1144engine.T_nodes where node_name = 'Algebra II')
and edge_type_id = 2);
Bien que cela ait une solution similaire à cette question , les problèmes sont posés très différemment. Ils peuvent finir par avoir la même solution, mais cela ne veut pas dire que les questions sont les mêmes.
set define off
est le moyen le plus simple de le faire.Réponses:
Au lieu de
utilisation
38 est le code ascii pour esperluette, et sous cette forme, il sera interprété comme une chaîne, rien d'autre. Je l'ai essayé et cela a fonctionné.
Une autre façon pourrait être d'utiliser LIKE et un soulignement à la place du caractère '&':
La chance que vous trouviez également un autre disque, qui n'est différent que dans ce seul caractère, est assez faible.
la source
chr(38)
, vous pouvez le fairenode_name = 'Geometric Vectors &' || ' Matrices'
chr(38)
, nonchar(38)
.&
n'a pas besoin d'être échappé dans MySQL. MySQL n'a pas non plus la fonctionCHR()
.Escape est défini
\
par défaut , vous n'avez donc pas besoin de le définir; mais si vous le faites, ne le mettez pas entre guillemets.Esperluette est le marqueur de variable de substitution SQL * Plus ; mais vous pouvez le changer , ou plus utilement dans votre cas le désactiver complètement, avec:
Ensuite, vous n'avez pas du tout besoin d'échapper à la valeur.
la source
\
par défaut, mais le paramètre booléenescape
est défini sur OFF par défaut. Ainsi, l'OP n'a peut-être pas besoin de définir le caractère d'échappement, mais il / elle en a au moins besoinSET ESCAPE ON
pour que cela fonctionne. Ou, bien sûr, utilisez l'une des autres solutions meilleures.Vous pouvez utiliser
En utilisant cela, il ne demandera pas l'entrée
la source
directement à partir du livre sur les principes de base d'Oracle SQL
comment y échapper sans définir de réglage.
la source
Pour
&
vous échapper, vous pouvez essayer les moyens suivants: -set scan off
set define off
set escape on
puis remplacez&
par/&
&
par&&
L'un d'eux devrait fonctionner au moins.
A n outre , si vous utilisez développeur PL / SQL puis il y a et icône en bas de la fenêtre sql s'il vous plaît allez - y et désactiver ce . Notez que dans l'ancienne version, cette option n'est pas présente.
Assurez-vous également que set define off est écrit au tout début du script.
la source
Cela fonctionne également:
select * from mde_product where cfn = 'A3D"&"R01'
vous définissez
&
comme littéral en englobant est avec des doubles qoutes"&"
dans la chaîne.la source
A3D"&"R01
Ou bien:
Le premier vous permet d'utiliser la barre oblique inverse pour échapper au &.
Le second s'éteint & "globalement" (pas besoin d'ajouter une barre oblique inverse n'importe où). Vous pouvez le réactiver à
set define on
partir de cette ligne et les esperluettes retrouveront leur signification particulière, vous pouvez donc la désactiver pour certaines parties du script et pas pour d'autres.la source
la source
J'ai écrit une regex pour aider à trouver et remplacer "&" dans un INSERT, j'espère que cela aide quelqu'un.
L'astuce était de s'assurer que le "&" était avec un autre texte.
Trouver
“(\'[^\']*(?=\&))(\&)([^\']*\')”
Remplacer
“$1' || chr(38) || '$3”
la source