2015-11-17 13 views
14

Pisząc test, porównywałem ciągi. Test powrócił jako Wada. Ręcznie skopiowałem wklejony ciąg i działa ... Zwróć uwagę na składnię napisu mysql; ale do tego momentu nigdy nie dotyka mysql.Javascript odczytuje "%%" jako "%" i "%%"?

Console.logged kopia + wklej Oba Struny wyglądać następująco:

console.log(replaced); 
"SELECT COUNT(*) FROM interaction WHERE ambassador_name LIKE '%' AND influencer_name = ?" 

console.log(sqlQuery0); 
"SELECT COUNT(*) FROM interaction WHERE ambassador_name LIKE '%' AND influencer_name = ?" 

to nie powinno być w przypadku braku ale to robi. Więc chciałem zobaczyć, gdzie kończy się niepowodzeniem:

it("submits the proper first sql query", function(){ 
    var replaced = dao.SQLquery[0].replace(/ +/g, ' '); 
    for (var i = 0; i < replaced.length; i++) { 
    if (replaced[i] != sqlQuery0[i]){ 
     console.log(replaced.slice(i-10,i+10)); 
     console.log(sqlQuery0.slice(i-10,i+10); 
     break 
    } 
    } 
}) 

ku mojemu zdziwieniu POWYŻSZYCH WRACAJĄCY to ..

me LIKE '%' AND inf 
me LIKE '%' AND infl 

Nie mogą być różne długości .... rację. Spróbowałem jeszcze raz.

it("submits the proper first sql query", function(){ 
    var replaced = dao.SQLquery[0].replace(/ +/g, ' '); 
    for (var i = 0; i < replaced.length; i++) { 
     if (replaced[i] != sqlQuery0[i]){ 
     console.log('|'+ replaced.slice(i-10,i+10)+'|',replaced.slice(i-10,i+10).length); 
     console.log('|'+sqlQuery0.slice(i-10,i+10)+'|',sqlQuery0.slice(i-10,i+10).length); 
     break 
     } 
    } 
    }) 

I do mojego większego zaskoczenia:

|me LIKE '%' AND inf| 20 
|me LIKE '%' AND infl| 20 

ale pierwszy ciąg jest tylko długość 19!

Mój ostatni attampt:

var replaced = dao.SQLquery[0].replace(/ +/g, ' '); 
for (var i = 0; i < replaced.length; i++) { 
    console.log(replaced[i], sqlQuery0[i]); 
    if (replaced[i] != sqlQuery0[i]){ 
    console.log('|'+ replaced.slice(i-10,i+10)+'|',replaced.slice(i-10,i+10).length); 
    console.log('|'+sqlQuery0.slice(i-10,i+10)+'|',sqlQuery0.slice(i-10,i+10).length); 
    break 
    } 
} 

dał mi tak:

n n 
a a 
m m 
e e 

L L 
I I 
K K 
E E 

' ' 
% % 
% ' 
|me LIKE '%' AND inf| 20 
|me LIKE '%' AND infl| 20 

Podobno "%%" jest interpretowane zarówno jako% i %% jak to może być?

więcej:

var replaced = dao.SQLquery[0].replace(/ +/g, ' '); 
console.log(sqlQuery0) 
for (var i = 0; i < replaced.length; i++) { 
    console.log(replaced[i], sqlQuery0[i]); 
    if (replaced[i] != sqlQuery0[i]){ 
    console.log('|'+ JSON.stringify(replaced.slice(i-10,i+10))+'|',replaced.slice(i-10,i+10).length); 
    console.log('|'+ JSON.stringify(sqlQuery0.slice(i-10,i+10))+'|',sqlQuery0.slice(i-10,i+10).length); 
    console.log('|'+ JSON.stringify(dao.SQLquery[0].slice(i-10,i+10))+'|',sqlQuery0.slice(i-10,i+10).length); 
    break 
    } 
} 

|"me LIKE '%' AND inf"| 20 
|"me LIKE '%' AND infl"| 20 
|"ame LIKE '%' AND in"| 20 
+2

Czy możesz _pewnie_ wkleić wynik każdego wywołania 'console.log()'? Z tego, co wiemy, są niewidoczne znaki Unicode w jednym ze stringów. –

+2

Co to jest 'sqlQuery0' w każdym z nich? Ustawiasz 'replace' na jedną rzecz, ale porównujesz ją z innym ciągiem znaków. W drugim teście mówisz "Ale pierwszy ciąg to tylko długość 19!" Który pierwszy ciąg i skąd masz 19? Drukujesz długość 20-znakowego podciągu (zakładając, że> = 10), więc oczywiście ma on 20 znaków. Jestem z @MattBall, prawdopodobnie jest 'nul' lub coś w jednym ze stringów. Może napisać funkcję, która zrzuca pozycję i kod znaku dla każdego znaku w łańcuchu, a następnie wywołuje go jednym ciągiem, a następnie drugim i porównuje wynik. – blm

+1

Pokaż nam, co to jest 'JSON.stringify (dao.SQLquery [0])' logi – Bergi

Odpowiedz

2

Jak zauważyli inni, prawdopodobnie masz jakieś ukryte znaku Unicode w jednej ze strun. Najlepszym sposobem zobaczenia jest użycie charCodeAt(), aby zobaczyć, jakie punkty kodu rzeczywiście istnieją.

Na przykład:

var a = 'foo\u200bbar'; 
var b = 'foobar'; 

console.log('a = "' + a + '"'); 
console.log('b = "' + b + '"'); 

function toCodePointArray(str) { 
    var result = []; 
    for (var i = 0; i < str.length; i++) { 
     result.push(str.charCodeAt(i)); 
    } 
    return result; 
} 

console.log('toCodePointArray(a) = ', toCodePointArray(a)); 
console.log('toCodePointArray(b) = ', toCodePointArray(b)); 

Kiedy uruchamiam to uzyskać:

a = "foo​bar" 
b = "foobar" 
toCodePointArray(a) = [ 102, 111, 111, 8203, 98, 97, 114 ] 
toCodePointArray(b) = [ 102, 111, 111, 98, 97, 114 ] 

Tutaj ukryta postać pojawia się wyraźnie jako 8203, który jest odpowiednikiem dziesiętnym 0x200b, który jest Przestrzeń zerowa szerokości Unicode.

7

rozszerza na co @Matt Ball i @blm powiedział, najprawdopodobniej mają charakter „niewidzialne” w tekście, który jest w zmiennej „zastępuje”. Aby to przetestować, użyj edytora szesnastkowego i wklej tekst ze zmiennych "zastąpionych" i sqlQuery0 w - powinieneś być w stanie zobaczyć, że wokół znaku "%" masz niewidzialną postać, taką jak '00' NUL lub '1E' separator rekordów.

Można użyć tego internetowego Hex Viewer przetestować https://hexed.it/?hl=en

zobaczyć kody ASCII mam na myśli, sprawdź tabelę ASCII http://www.asciitable.com/

1

aby uniknąć tego problemu, który tworzy dodatkowe bity, korzystanie hex char val. dla% to 0x25

"SELECT COUNT(*) FROM interaction WHERE ambassador_name LIKE "X'250225'" AND influencer_name = ?" 

lub nawet

"SELECT COUNT(*) FROM interaction WHERE ambassador_name LIKE "%X'250225'%" AND influencer_name = ?" 

Druga technika polegałaby na użyciu Znajdź prostszych wiąże heks val jednak jest trochę wolniej.

"SELECT COUNT(*) FROM interaction WHERE LOCATE(X'25', ambassador_name) > 0 AND influencer_name = ?" 

również, jak mówi Rob Wilson, aby uniknąć dodatkowych niechlujny bitów w Unicode przy użyciu LIKE, zawsze wiążą PDO :: PARAM_STR za podobne. W procesie ucieczki wtrysku PDO również oczyszcza te dodatkowe bity.

SELECT COUNT(*) FROM interaction WHERE ambassador_name LIKE ? AND influencer_name = ? 

bindParam(1, "X'250225'", PDO::PARAM_STR); 

lub nawet

bindParam(1, "%X'250225'%", PDO::PARAM_STR); 
+0

Co rodzaj składni ucieczki? PHP? SQL? To nie JS, o to chodzi w PO. – Bergi

+0

Przepraszam, że php. W przypadku JS użyj albo i nie używaj wiązania. Ten sam wynik. – cpugourou

+0

Widziałem? Wiąż z zapytaniem, więc ... w każdym razie jest to mysqli lub pdo – cpugourou

Powiązane problemy