ciao tito_livio
potresti vedere con quale charset è stato creato il DB in MySql?
Se ad esempio trovi qualcosa tipo:
CREATE DATABASE `database_di_prova` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */;
già sappiamo che i dati sono memorizzati nel DB in uft8.
Poi dovresti vedere anche la tabella che ti interessa, vedere se nel DDL c'è qualcosa tipo:
CREATE TABLE `tabella_001` (
...
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Secondo me potrebbe chiarirci meglio il problema.
Ciao
Edit:
se ad esempio fai un backup - che in fondo è uno script SQL - al suo interno puoi trovare sia le varie "CREATE" che le "INSERT"...
Giusto per darti una soluzione alla mano, i dati nel DB vengono trattai come Unicode (utf-8), ma è probabile che il software avesse scritto i dati in CP 1250.
Al momento sto "elaborando" tutto il materiale che mi hai fornito con i tuoi post, però ti posso dire che ho letto i dati scritti (col prog nuovo) come se fossero stati scritti in CP1250 (col prog vecchio).
In effetti quello che leggo cambia ma sono sempre caratteri indefiniti: ??é??? @#°€.
Mi spiego come ho fatto a leggerli in CP1250:
Premetto che uso i componenti "di serie" per accedere al db, quindi uso questa istruzione:
MySQL50Connection1.CharSet := 'CP1250';
Il problema è capire quale charset è stato utilizzato dal prog vecchio, quindi ho fatto diverse prove sostituendo al CP1250 i vari CP850, CP852,..., latin1, latin2 e altri, ne ho provato circa 20, i caratteri letti cambiano ma non sono mai quelli giusti.
Ho provato pure a mettere nel prog vecchio: showmessage(MySQL50Connection1.CharSet)
ma non visualizza niente.
per adesso grazie a tutti per le risposte, continuo a sbatterci la testa.
Nota: I dati non sono stati scritti poi tanto tempo fa, la vers. 2.0.6 avrà circa 6-7 anni. Quest'estate ho convertito meglio da Delphi3-Paradox.
se usi windows è quindi certo che il charset usato dal DB sia CP1250
quindi dovresti assicurarti che quando ti connetti come client, lo fai con lo stesso charset
quando dici che già usi
MySQL50Connection1.CharSet := 'CP1250';
dovrebbe funzionare...
per curiosità, nel backup, se guardi nelle INSERT le lettere accentate sono corrette vero?
se usi windows è quindi certo che il charset usato dal DB sia CP1250
quindi dovresti assicurarti che quando ti connetti come client, lo fai con lo stesso charset
quando dici che già usi
MySQL50Connection1.CharSet := 'CP1250';
dovrebbe funzionare...
per curiosità, nel backup, se guardi nelle INSERT le lettere accentate sono corrette vero?
Ho provato a mettere quella istruzione, impostando il charset cp1250, ma non funziona, lettere illegibili. Anche nel Backup le lettere appaiono illeggibili.
Da notare che se eseguo nel lazarus nuovo:
showmessage(inttostr(sqlquery1descriz.CodePage))
ottengo 1252.
Nel lazarus vecchio (2.0.6) questa proprietà non esiste.
Poi se imposto, sempre nel nuovo:
MySQL50Connection1.CharSet := 'CP1252';
mi da errore:
Failed to set connection character set: Can't initialize character set cp1252 in c:\program Files\MySql\MySql server 5.0\share\charsets\
E in effetti in quella cartella CP1252.xml non c'è mentre ci sono altri codepage come cp1250,cp1252 ecc.
MySQL50Connection1.CharSet := 'CP1252';
mi da errore:
Failed to set connection character set: Can't initialize character set cp1252 in c:\program Files\MySql\MySql server 5.0\share\charsets\
E in effetti in quella cartella CP1252.xml non c'è mentre ci sono altri codepage come cp1250,cp1252 ecc.
Prova a vedere se con questa risolvi:
function ConvertiStringa(St: String; TipoConvStr: TTipoOperConvStr): String;
begin
{$IFDEF MSWINDOWS}
case TipoConvStr of
tocLeggi: St:={CP1252ToUTF8(St)}WinCPToUTF8(St);
tocScrivi: St:={UTF8ToCP1252(St)}UTF8ToWinCP(St);
end;
{$ENDIF}
Result:=St;
end;
Di solito era la mia ultima spiaggia quando non avevo più voglia di sbatterci la testa...
Per usarla, devi aggiungere "LazUTF8" alla uses.
P.S. Se non funziona con tocLeggi, prova con tocScrivi
Ciao, Mario
Ma scusa, i dati che hai presentato sono stati inseriti con il vecchio programma ?
A questo punto non saprei aiutarti, sembra che ciò che leggi dal DB venga codificato in UTF-8 con il nuovo Lazarus. Però il problema è che i dati interni probabilmente sono in caratteri standard ANSI.
Prova a cercare in rete, se hai questo problema sicuramente anche qualcun altro l'ha avuto.
Mi sembra comunque molto strano ciò che accade, dovrebbe avere colpito tantissime applicazioni.
N.B.: comunque i dati dovrebbe "essere" in formato CP-1252 o Windows-1252 in quanto alcuni caratteri che hai presentato esistono solo in quelle codifiche.
Cerca e ricerca credo di aver capito cosa è successo.
Fra la versione 2.0.8 e la versione 2.0.10 gli sviluppatori Lazarus decidono di trattare le stringhe non più in Codepage ma in UTF8.
Che il modo di memorizzare le stringhe sia cambiato lo si può dedurre da: https://wiki.freepascal.org/String (https://wiki.freepascal.org/String).
Io non cambio spesso la versione di Lazarus perché ad ogni cambio ci sono parecchie cose da risistemare ma ogni tanto si deve fare.
In altri miei progetti avevo inserito un comando del tipo: MySQL50Connection1.CharSet := 'utf8';
fin dalle prime versioni quindi non mi sono accorto di niente anche compilando con un nuovo Lazarus.
In questo vecchio progetto avevo lasciato fare a Lazarus, quindi il programma scriveva e leggeva in CP1252.
I dati che ti ho presentato erano stati scritti col vecchio programma, il nuovo programma assume che siano stati scritti in UTF8 quindi, quando legge, li decodifica con l'algoritmo sbagliato.
Ci sono anche altri che sono rimasti "fregati" da questo cambiamento (che credo giusto anche se doloroso), come si può vedere da: https://forum.lazarus.freepascal.org/index.php/topic,53250.0.html?PHPSESSID=8bn5bmfl99i3s8poqo6ht6dn63 (https://forum.lazarus.freepascal.org/index.php/topic,53250.0.html?PHPSESSID=8bn5bmfl99i3s8poqo6ht6dn63).
Non credo sia possibile impostare Lazarus moderno per fargli trattare le stringhe in codepage, per cui col nuovo programma mi andrò a fare una routine di conversione.
Per questa conversione c'è il modo suggerito da @bonmario e un altro nell'ultimo link che ho messo, vedrò di mettere su qualcosa.
Vi faccio sapere,
ciao
quando creo i database in MySql cerco di crearli in utf8.
Poi lancio le seguenti istruzioni da client
FConnection.CreateStatement.Execute('SET NAMES ''utf8''');
FConnection.CreateStatement.Execute('SET CHARACTER SET ''utf8''');
FConnection.CreateStatement.Execute('SET character_set_client = ''utf8''');
FConnection.CreateStatement.Execute('SET character_set_database = ''utf8''');
FConnection.CreateStatement.Execute('SET collation_connection = ''utf8mb4_unicode_ci''');
in questo link trovi della documentazione
https://dev.mysql.com/doc/refman/8.4/en/set-character-set.html
Spero possa essere utile
Alla fine ho deciso convertire gli archivi per averli in utf8.
Come consigliato da @bonmario utilizzo l'istruzione: nuova_stringa:=UTF8ToWinCP(vecchia_stringa)
e poi salvo nuova_stringa nel suo campo del db, ovviamente usando la unit lazutf8.
Poi,da questo momento in poi, il nuovo programma leggerà le stringhe correttamente.
C'è però da fare attenzione ai caratteri inseriti nei vecchi programmi usando alt-xxx, a me è capitato un ≥ che la funzione ha tradotto con un =, per cui, in questi casi ho dovuto fare una traduzione mia personalizzata.
Le vocali accentate, l'€ ed il ° invece vengono tradotte per bene.
Grazie per l'aiuto,
alla prossima