2011-09-29 8 views
7

Ho riscontrato un problema molto insolito con MySQL, che implicava il backslash. Fondamentalmente quando faccio una partita jolly con LIKE per \ n che è nella base di dati come testo piuttosto che un ritorno a capo effettivo, verrà restituito solo un match se ho solo un diritto jolly mano:Comportamento anomalo quando si esegue LIKE con i caratteri jolly alla ricerca di barra rovesciata in MySQL

SELECT * 
FROM `tmptest` 
WHERE `a` LIKE '\\\\n%' 

Ora, se interrogo come questo, non tornerà nulla:

SELECT * 
FROM `tmptest` 
WHERE `a` LIKE '%\\\\n%' 

come si può vedere dai dati che ho in tabella entrambe le query devono essere corrispondendo. Non sono sicuro se si tratta di qualcosa che mi manca, o sto scorrendo in modo errato la nuova riga ma non ha senso che la prima query funzioni e la seconda no.

Struttura della tabella:

CREATE TABLE IF NOT EXISTS `tmptest` (
`a` varchar(22) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

dati Esempio:

INSERT INTO `tmptest` (`a`) VALUES 
('\\n'), 
('\\n\\ndfsdfsdfs\\n'); 

Grazie per aver tempo di leggere questo.

+1

Strano, funziona bene per me. Quale versione di mysql stai usando? – Jim

+2

+1, problema interessante. Ti lodo per aver incluso le informazioni corrette su come creare la struttura e inserire dati di esempio. Ottimo primo post. –

+1

L'ho replicato qui. Versione: mysqld Ver 5.1.49-log per suse-linux-gnu su i686 (SUSE MySQL RPM) –

risposta

6

Funziona per me con backslash quando si utilizza il jolly lato sinistro:

mysql> SELECT * FROM `tmptest` WHERE `a` LIKE '%\\\\\\n%'; 
+-----------------+ 
| a    | 
+-----------------+ 
| \n    | 
| \n\ndfsdfsdfs\n | 
+-----------------+ 
2 rows in set (0.00 sec) 

Utilizzando mysqld Ver 5.1.49


@Karolis per quanto ho capito il l'espressione per l'operatore LIKE deve essere analizzata due volte, quindi \\\\ diventa \ se utilizzato con LIKE.

Ma come spiegare questo (usando l'espressione "indietro \ slash"):

SELECT 'back\\slash' LIKE '%back\\\\slash%'; -> TRUE (comportamento normale)

SELECT 'back\\slash' LIKE '%back\\\\\slash%'; -> true

SELECT 'back\\slash' LIKE '%back\\\\\\slash%'; (5 backslash?) -> TRUE (6 backslash?)

SELECT 'back\\slash' LIKE '%back\\\\\\\slash%'; - (? 7 backslash)> true

SELECT 'back\\slash' LIKE '%back\\\\\\\\slash%'; -> FALSO (comportamento normale, immagino ..)

Tuttavia se cercasse solo per la "\":

mysql> SELECT 'back\\slash' LIKE '%\\\\%'; -> false (ma dovrebbe funzionare)

mysql> SELECT 'back\\slash' LIKE '%\\\\\%'; -> TRUE (5 backslash)

mysql> SELECT 'back\\slash' LIKE '%\\\\\\%'; -> TRUE (6 backslash)

mysql> SELECT 'back\\slash' LIKE '%\\\\\\\%'; -> false (7 backslash)

Per thi s particolare domanda, si potrebbe utilizzare un diverso carattere di escape | e bypassare il problema del tutto (se non si verifica alcun | carattere):

mysql> SELECT 'back\\slash' LIKE '%\\%' ESCAPE '|'; -> TRUE

Quindi forse qualche guru mysql là fuori può spiegare questo. Semplicemente non posso. testato anche con mysql 5.1.53 su una macchina diversa. Lo stesso comportamento è stato osservato. Come ho iniziato commentando, è una domanda piuttosto interessante.

+0

Hai capito, grazie mille. Leggendario! – Adam

+2

@Qsp Avete una spiegazione per questo? – Karolis

+0

Inoltre, per chiunque lo legga in futuro e stia cercando di usarlo in uno script PHP, la query dovrà essere in apostrofi anziché in virgolette e avrà bisogno di 12 barre rovesciate. – Adam

0

Sulla base della risposta QSP (Come lo ringrazio per aver salvato la mia giornata).

Direi usare blackslash. Non capisco perché come QSP e Karolis, ma se sostituisci 1 barra di 5 sbobinature in MySQL (o 10 in PHP), funziona ancora come dice QSP.

MA MA la cosa buona, è che se si sostituisce '\\' con 12 backslash (o 24 in php) come suggerito da QSP, non funzionerà. Ma se lo sostituisci con 10 backslash (o 20 in php) funzionerà ancora.

Spero che possa aiutare qualcuno come risposta QSP è già accettato.

EDIT:
Funziona bene se lo fai:
% \\\\\%
% \\\\\\\\\\%
% k \\\\\\ \\\\ s%
% \\\\\\\\\ s%
% k \\\\\ s% (se solo 1 barra come indietro \ barra)
Ma non funziona se si fa:
% k \\\\\\\\\\%
% k \\\\\%
% \\\\\ s%
lo farò conti nue a cercare perché.

Problemi correlati