Autore Topic: Se una stringa con MySql contiene una singola virgoletta  (Letto 504 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Vorrei riportarvi questo messaggio apparso nella M.L.I.:


" I have a database which conntains a string  'Queen's Head' so
Codice: gambas [Seleziona]
hResult = hConn.Exec("SELECT contacts.* FROM contacts WHERE Title = 'Queen's Head'")

How best to solve this?

bill-lancaster
"


" It's because Queen's Head has a ' in the string.

I always use:

Codice: gambas [Seleziona]
Var="Queen's Head"
     hResult=hConn.Exec("SELECT contacts.* FROM contacts WHERE Title=" & "\"" & Var & "\"")

or
Codice: gambas [Seleziona]
 hResult=hConn.Exec("SELECT contacts.* FROM contacts WHERE Title=" & Chr(34) & Var & Chr(34))

Maybe there other solutions, I'm not a professional programmer.

Johny
"


" This is even shorter:
Codice: gambas [Seleziona]
hResult = hConn.Exec("SELECT contacts.* FROM contacts WHERE Title='Queen\\'s Head'")

Since ' is meaningful in MySQL, you have to mask it with \ and since you do
this in a Gambas string constant, you have to double the backslash.

Regards,
Tobi
"


" And this work also:
Codice: gambas [Seleziona]
hResult = hConn.Exec("SELECT contacts.* FROM contacts WHERE Title=&1" ,"'Queen's Head'") ' that is the gambas way

or
Codice: gambas [Seleziona]
hResult = hConn.Exec("SELECT contacts.* FROM contacts WHERE Title =" & Replace("'Queen's Head'","'","''")) ' that is the SQL way

** both examples not tested
--
Amicalement
Charlie
"
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline giob1642

  • Grande Gambero
  • ***
  • Post: 159
    • Mostra profilo
Re: Se una stringa con MySql contiene una singola virgoletta
« Risposta #1 il: 10 Agosto 2013, 20:21:50 »
secondo le specifiche mysql(altri database ?) le doppie "definiscono una stringa"come tate può essere integrata nella stringa della query così:
query="select * from  tabteA where column3 = definiscono una stringa"
viceversa se  assegnamo a=column3  la query diventa
 query="select * from  tabteA where" & a & "=" definiscono una stringa"
la stringa" definiscono una stringa" per mysql è ambigua  ,necessitano quindi degli apici singoli che non fanno altro di non iterpretare la stringa  e gli apici vengono aggiunti cosi
query="select * from  tabteA where " & a & "='" definiscono una stringa"'"
viceversa se  assegnamo b=" definiscono una stringa"   la query diventa
query="select * from  tabteA where " & a & "='" & b &"'"
In definitiva quello inserito tra apici singoli non viene interpretato ma viene inserito nequery così com'è.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Se una stringa con MySql contiene una singola virgoletta
« Risposta #2 il: 12 Agosto 2013, 17:37:42 »
Il discorso è valido in tutti i lunguaggi, che inviano il parsing delle stringhe ad apposite librerie esterne (di soli C/Perl o Python).
Il concetto è che alcuni caratteri funzono da caratteri di controllo, per cui è necessario indicare che questi non vanno interpretati come controlli, bensì come normali caratteri.
Nella sintassi Perl, quella normalmente usata, e su cui si basano più o meno tutti i linguaggi, identificano nel carattere "\" come indicatore che il carattere di seguito non deve essere considerato come controllo.
Il motivo del doppio slash è perchè anch'esso è un carattere di controllo, per cui nelle varie trasformazioni questo viene interpretato suo malgrado.
Anteponendo uno slash davanti allo slash componente la stringa, indica al compilatore che il secondo carattere deve essere passato così com'è alla libreria che ne farà il parsing. A quest'ultima, quindi, verrà passato un slo slash (il primo viene eliminato dal linguaggio primario), e sua volta lo userà per interpretare il successivo carattere.
A volte capita di trovare stringhe con quattro o più slash, conseguentemente al numero di passaggi che deve fare la stringa (da una libreria all'altra...).