Autore Topic: [risolto]query e lettere accentate  (Letto 9086 volte)

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
[risolto]query e lettere accentate
« il: 18 Dicembre 2010, 22:32:57 »
ho problemi con una query su database mysql

la query
Citazione
sqlc = "SELECT * FROM clienti WHERE cognome LIKE '" & StrIm & "%'"
          MyRsc = MODMain.MyConn.Exec(sqlc)

inserendo nella text lettere accentate tipo (ò à ç ecc.. ) mi da
Citazione
Errore Query failed: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'like'

in pratica in StrIm il carattere non viene riconosciuto e mi inserisce spazi vuoti
« Ultima modifica: 19 Dicembre 2010, 01:55:12 da dex »

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: query e lettere accentate
« Risposta #1 il: 19 Dicembre 2010, 00:28:32 »
Dai un'occhiata a questa discussione
http://www.gambas-it.org/smf/index.php?topic=583.0
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: query e lettere accentate
« Risposta #2 il: 19 Dicembre 2010, 01:53:03 »
Risolto  :hatecomputer: :hatecomputer:

il problema era che Like non accettava caratteri superiori a 127

ho creato una sub che intercetta tutti caratteri non Ascii e li converte in null

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: [risolto]query e lettere accentate
« Risposta #3 il: 19 Dicembre 2010, 02:09:58 »
Dex... ho avuto anch'io lo stesso problema... e proprio ieri ho aperto una discussione sul Charset di MySQL...

Per risolvere e continuare ad usare nelle query anche i caratteri accentati ti consiglio di modificare il charset della colonna in uft8. Io l'ho messo predefinito direttamente in tutto il db.

@Tornu... il tuo link si riferisce ai problemi dovuti all'apostrofo, non ai caratteri oltre il chr(127) tipo le lettere accentate: ò, à, è, ecc.  ;)
« Ultima modifica: 19 Dicembre 2010, 02:11:45 da perseo »

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: [risolto]query e lettere accentate
« Risposta #4 il: 19 Dicembre 2010, 13:34:32 »
Dex... ho avuto anch'io lo stesso problema... e proprio ieri ho aperto una discussione sul Charset di MySQL...

Per risolvere e continuare ad usare nelle query anche i caratteri accentati ti consiglio di modificare il charset della colonna in uft8. Io l'ho messo predefinito direttamente in tutto il db.

@Tornu... il tuo link si riferisce ai problemi dovuti all'apostrofo, non ai caratteri oltre il chr(127) tipo le lettere accentate: ò, à, è, ecc.  ;)

il mio problema non era per il database, sul database salva le accentante, è l'operatore Like di Gambas che non accetta dopo il 127.

cmq se volessi cambiare charset al mio database come posso procedere, tieni presente che ci sono database gia creati con Latin1 e riempiti di dati.

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: [risolto]query e lettere accentate
« Risposta #5 il: 19 Dicembre 2010, 15:17:03 »
Non lo sapevo mica del LIKE... Sono andato sul WIKI e la cosa è documentata come dici tu: accetta solo gli ASCII.
Citazione
Attenzione! LIKE si occupa come solo dei caratteri ASCII. Per ricercare stringhe con il set di caratteri UTF-8, Usare la gb.pcre componenti.

Che cos'è la gb.pcre? Ho provato a leggere la documentazione ma mi ci sono incasinato...  ???
http://gambasdoc.org/help/comp/gb.pcre

Andando ad approfondire il concetto di RegExp... ho scoperto che attraverso questa classe è possibile eseguire dei controlli di espressioni regolari.
Ad esempio attraverso questo codice, viene verificato se la stringa inserita è un indirizzo_mail valido:
Esempio:

Spuntare il componente "gb.pcre"

Codice: gambas [Seleziona]
DIM myemail AS String
DIM validemail AS String
DIM re AS RegExp

myemail = "f...@bar"

re = new RegExp(myemail, "(?i)\\b[a-z0-9\\._%\\...@[a-z0-9._%\\-]+\\.[a-z]{2,4}\\b")
validemail = re.Text
if not validemail then
        print myemail & " is not a legal email address.\n"
else
        print myemail & "\n"
end if


Credo che sia un argomento sicuramente da approfondire...  ;)


PS.
Qui ho trovato del materiale per la conversione da Latin1 ad Utf8. A me interessa meno perché il DB lo creo di sana pianta (o al limite lo devo popolare solo in parte da un file .cvs).
http://en.gentoo-wiki.com/wiki/Convert_latin1_to_UTF-8_in_MySQL
« Ultima modifica: 19 Dicembre 2010, 15:51:50 da perseo »

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: [risolto]query e lettere accentate
« Risposta #6 il: 19 Dicembre 2010, 17:11:15 »
REGEXP è anche una funzione nativa di MySQL...

http://database.html.it/articoli/leggi/2665/mysql-e-regular-expression/


Dal quel poco che sono riuscito a capire mi pare che sia simile a LIKE però più performante.

Il problema delle accentate...
Potresti creare una function REPLACE da Gambas... che sostituire nella stringa di ricerca le accentate con dei punti "."
Quando MySQL esegue la Query... accetta tutti i caratteri quando incontra un punto... in questo modo il programma non va più in errore.

Ad esempio, una parola tipo 'Patanè', la passi alla funzione replace e diventa 'Patan.', che nella stringa di ricerca diventa "...WHERE cognome REGEXP 'Patan.';"

Ma bisogna approfondire ancora... secondo me c'è il modo anche per fare la ricerca sulle accentate.  ;)

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: [risolto]query e lettere accentate
« Risposta #7 il: 19 Dicembre 2010, 18:04:56 »
Dex,

credo di poterti dare delle notizie interessanti! Lo spero...  :)

Per fare una prova ho creato in MySQL un database con una tabella ed un campo. Ho usato immediatamente come Charset = UTF-8 Unicode... e come Collation = UTF8_generali_ci.
Poi ho popolato il DB con delle parole accentate: città, cioè, ancòra, così, ecc.

Poi sono passato a Gambas ed ho creato un programmino per interrogare il db. Quando da ho lanciato la Query con LIKE non mi restituiva più errore...
Ad esempio...
Se la ricerca usa "....LIKE '%à%';" mi restituisce tutte le parole contenenti 'a' oppure 'à' --> 'città' ed 'ancòra'.
Ho provato poi a cambiare la stringa di ricerca con REGEXP --> "....REGEXP '.*à.*';" --> questa a differenza di LIKE è case-accentate... quindi mi restituiva solo 'città'.

Quindi REGEXP batte LIKE 2 a 1...  ;D


NB: La differenza tra ASCII e UTF8 sta nel fatto che quest'ultima codifica richiede per alcuni caratteri più byte, quindi il carattere di Latin1 'à' in UTF8 diventa con 3byte... 'ÃÂ' ... Però se lo inserisci direttamente da UTF8 lo legge come lo scrivi. Quindi credo bisogna effettuare un processo di conversione per passare dall'uno all'altro.

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: [risolto]query e lettere accentate
« Risposta #8 il: 19 Dicembre 2010, 22:34:41 »
interessante.

posso crearmi un backup del database e provare a inserirlo in uno nuovo utf-8

pero prima bisognerebbe provare con pdfwriter a stampare dati provenienti da utf-8.

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: [risolto]query e lettere accentate
« Risposta #9 il: 19 Dicembre 2010, 23:55:04 »
Ho già fatto la prova anche con PDFWriter... Tutt'Ok!  :ok:

Ho stampato perfettamente generato questa riga dal DB settato a UTF-8: 'a μ à è € $ À'.
la prima a era una lettera alfa ('α'), ma con il replace gliela faccio convertire in 'a'. La 'μ' si trova anche nell'ASCII esteso di PDFWriter, come chr(181).

Sostanzialmente PDF-Writer genera il testo esattamente come prima, però immagina se MD troverà il tempo per fare il porting alla TFPDF (FPDF esteso all'UTF8...) avremmo la possibilità di stampare anche il cinese...  ;D

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: [risolto]query e lettere accentate
« Risposta #10 il: 20 Dicembre 2010, 00:38:28 »
REGEXP è anche una funzione nativa di MySQL...

Dal quel poco che sono riuscito a capire mi pare che sia simile a LIKE però più performante.


Regexp non è una funzione nativa di nessun linguaggio. È semplicemente una forma sintattica particolare che permette di eseguire diversi controlli ed operazioni sulle stringhe.

Una lettura istruttiva è questa: http://it.wikipedia.org/wiki/Espressione_regolare

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: [risolto]query e lettere accentate
« Risposta #11 il: 20 Dicembre 2010, 01:04:19 »
http://dev.mysql.com/doc/refman/5.1/en/string-functions.html

Volevo intendere che è una funzione sulle stringhe che adotta MySQL...

@dex:
Non sapevo che con la funzione di gambas string.chr(unicode as integer) potessi scrivere qualsiasi carattere unicode.
Prova...

TextBox1.Text = "Questa è la lettera beta " & string.chr(8674) & " " & string.chr(946)

Ti restituisce:

'Questa è la lettera beta ⇢ β'

PS. notare la freccia tratteggiata...  ;)
PPS. il valore di unicode as integer da mettere dentro string.chr(...) è quello che trovi in "Tabella dei Caratteri" (sotto applicazioni) --> nel 'tab' dettagli carattere --> entità XML decimale: β --> solo la parte decimale 946.
« Ultima modifica: 20 Dicembre 2010, 01:23:44 da perseo »