Estou tentando consultar uma determinada linha pelo nome no meu banco de dados sql e ele tem um e comercial. Tentei definir um caractere de escape e depois escapar do e comercial, mas por algum motivo isso não está funcionando e não tenho certeza sobre qual é exatamente o meu problema.
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);
Embora isso tenha uma solução semelhante a essa pergunta , os problemas são colocados de maneira muito diferente. Eles podem acabar tendo a mesma solução, mas isso não significa que as perguntas sejam as mesmas.
set define off
é a maneira mais simples de fazer isso.Respostas:
Ao invés de
usar
38 é o código ascii para e comercial e, dessa forma, será interpretado como uma sequência, nada mais. Eu tentei e funcionou.
Outra maneira poderia ser usar LIKE e um sublinhado, em vez do caractere '&':
A chance de você encontrar outro disco também, que é diferente apenas nesse personagem, é bastante baixa.
fonte
chr(38)
, você pode fazernode_name = 'Geometric Vectors &' || ' Matrices'
chr(38)
, nãochar(38)
.&
não precisa ser escapado no MySQL. Além disso, o MySQL não tem a funçãoCHR()
.Escape está definido como
\
padrão , portanto você não precisa defini-lo; mas se o fizer, não o coloque entre aspas.E comercial é o marcador de variável de substituição do SQL * Plus ; mas você pode alterá-lo ou, mais útil, no seu caso, desativá-lo completamente, com:
Então você não precisa se preocupar em escapar do valor.
fonte
\
padrão, mas o parâmetro booleanoescape
está definido como OFF por padrão. Portanto, o OP pode não precisar definir o caractere de escape, mas ele precisa pelo menosSET ESCAPE ON
para que isso funcione. Ou, é claro, use qualquer uma das outras soluções melhores.Você pode usar
Usando isso, não solicitará a entrada
fonte
direto do livro de fundamentos oracle sql
como alguém escaparia sem definir definir.
fonte
Para escapar,
&
você pode tentar as seguintes maneiras: -set scan off
set define off
set escape on
substitua&
por/&
&
por&&
Um deles deve trabalhar pelo menos.
A dditionally se você estiver usando desenvolvedor PL / SQL, então há & ícone na parte inferior da janela sql por favor, vá lá e desativar ele . Observe que na versão anterior esta opção não está presente.
Certifique-se também de que set define off esteja gravado no início do script.
fonte
Isso também funciona:
select * from mde_product where cfn = 'A3D"&"R01'
você define
&
como literal colocando-o com qoutes duplos"&"
na cadeia.fonte
A3D"&"R01
ou alternativamente:
O primeiro permite que você use a barra invertida para escapar do &.
O segundo desliga e "globalmente" (não é necessário adicionar uma barra invertida em nenhum lugar). Você pode ativá-lo novamente
set define on
e a partir dessa linha, o e comercial terá seu significado especial de volta; portanto, você pode desativá-lo em algumas partes do script e não em outras.fonte
fonte
Eu escrevi um regex para ajudar a encontrar e substituir "&" dentro de um INSERT, espero que isso ajude alguém.
O truque era garantir que o "&" estivesse com outro texto.
Encontrar
“(\'[^\']*(?=\&))(\&)([^\']*\')”
Substituir
“$1' || chr(38) || '$3”
fonte