Topic: [RISOLTO]Memorizzazione emoticon su Mariadb  (Letto 195 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline sergio59

  • python unicellularis
  • *
  • Post: 19
  • Punti reputazione: 0
    • Mostra profilo
[RISOLTO]Memorizzazione emoticon su Mariadb
« il: Ottobre 27, 2020, 21:39 »
Salve a tutti.
Sto facendo uno script in python che gestisce un BOT telegram.
Questo BOT permette l'invio di messaggi, ed io vorrei memorizzare i caratteri che vengono inviati in una tabella del mio DB.
Questi messaggi possono contenere anche emoticon, ma non riesco a salvare la stringa.
Ho modificato il database per poter memorizzare la stringa sia a livello di database, tabelle e colonne;
modificato le variabili, ma non so più dove sbattere la testa.
Ho provato a scrivere la stringa in un file e questa stringa viene scritta correttamente (si vedono le emoticon e non ???), insomma, ogni volta che viene inserita questa emoticon, il programma mi dice:
UnicodeEncodeError: 'latin-1' codec can't encode characters in position XXX-XXX: Ordinal nonin range(256)

e nel file la scritta di prova "Ciao amministratore, come va😀👍"
Non so più dove sbattere la testa.
Queste le righe dove creo il nuovo db:
cursor.execute('CREATE DATABASE IF NOT EXISTS %s CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;'%db_tableTelegram)
cursor.execute('CREATE TABLE IF NOT EXISTS Users (UserName VARCHAR(50) COLLATE utf8mb4_unicode_ci, UserID VARCHAR(10) PRIMARY KEY, DateFirstRegistration DATETIME, UserType VARCHAR(25), Magnitude DOUBLE DEFAULT \'2.0\', Enabled BOOLEAN, EventType VARCHAR(1) DEFAULT \'M\', Map BOOLEAN, ResendGalleryToAdmin BOOLEAN DEFAULT True, Station_Alert VARCHAR(4096)) CHARSET = utf8mb4 COLLATE utf8mb4_unicode_ci;')
cursor.execute('CREATE TABLE IF NOT EXISTS History (UserName VARCHAR(50), UserID VARCHAR(10), MessageDate DATETIME, Message_Receive VARCHAR(4096) DEFAULT \'\', Message_Sent VARCHAR(4096) DEFAULT \'\', TimeNow TIMESTAMP DEFAULT CURRENT_TIMESTAMP) CHARSET = utf8mb4 COLLATE utf8mb4_unicode_ci;')

e via di questo passo.

Come dicevo ho cambiato anche le variabili

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_general_ci |
| collation_database       | utf8mb4_general_ci |
| collation_server         | utf8mb4_general_ci |
+--------------------------+--------------------+

Dove atro potrei guardare?

Grazie a tutti

Sergio


« Ultima modifica: Ottobre 29, 2020, 22:12 da sergio59 »

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.144
  • Punti reputazione: 9
    • Mostra profilo
Re:Memorizzazione emoticon su Mariadb
« Risposta #1 il: Ottobre 28, 2020, 10:28 »
Ma guarda, non è che ci sia molto da "sbattere la testa", ci sarebbe invece da usare un database decente. (E da sapere che cosa è unicode e che cosa sono gli encoding, giusto in caso di necessità.)
Devi dire intanto al tuo driver di non usare Latin-1, perché *ovviamente* Latin-1 non copre i code point extraplanari (e qui in effetti torna comodo sapere che cosa è unicode... ma certo, anche un driver che usa Latin-1 di default nel 2020... ce ne vuole). Ma soprattutto devi dire al tuo database di non usare encoding assurdi... Ovviamente i database decenti lavorano in utf8 senza problemi, ma quello che usi tu non è un database decente, quindi non mi meraviglierebbe se occorresse fare qualche salto mortale per farglielo usare... eh.
Non mi azzardo a entrare nei dettagli della documentazione di quel database che non voglio neanche nominare... lascio a te l'ingrato compito... Però posso indirizzarti a questa risposta https://stackoverflow.com/a/30074553 da cui puoi partire per farti un'idea...

Offline sergio59

  • python unicellularis
  • *
  • Post: 19
  • Punti reputazione: 0
    • Mostra profilo
Re:Memorizzazione emoticon su Mariadb
« Risposta #2 il: Ottobre 28, 2020, 12:59 »
Grazie RicPol (sapiens sapiens),
ho girato molto in giro e so la differenza tra utf8 e utf8mb4, il problema in effetti è che non riesco a capire perchè utilizza Latin1 quando credo (o almeno credevo) di avergli segato le gambe!!

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.144
  • Punti reputazione: 9
    • Mostra profilo
Re:Memorizzazione emoticon su Mariadb
« Risposta #3 il: Ottobre 28, 2020, 13:57 »
eh, purtroppo la qualità dei driver dei database peggiori è pari alla qualità dei database stessi. Non ti resta che frugare bene a fondo nella documentazione (o magari nel codice sorgente) del driver. E/o provare un altro driver. E/o impostare il locale della shell prima di avviare il programma, se vedi che il driver pesca da questo.

E/o cambiare database beninsteso.

Offline sergio59

  • python unicellularis
  • *
  • Post: 19
  • Punti reputazione: 0
    • Mostra profilo
Re:Memorizzazione emoticon su Mariadb
« Risposta #4 il: Ottobre 29, 2020, 08:39 »
Quindi non c'è nulla da fare?

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.144
  • Punti reputazione: 9
    • Mostra profilo
Re:Memorizzazione emoticon su Mariadb
« Risposta #5 il: Ottobre 29, 2020, 11:28 »
> Quindi non c'è nulla da fare?

Beh, tra circa cinque miliardi di anni il sole diventerà una supernova e inghiottirà la terra in mare di fuoco, quindi suppongo che non ci sia nulla da fare, alla fine.
Ma nel frattempo che aspetti, di alternative possibili te ne ho appena date una certa quantità.

Offline sergio59

  • python unicellularis
  • *
  • Post: 19
  • Punti reputazione: 0
    • Mostra profilo
Re:Memorizzazione emoticon su Mariadb
« Risposta #6 il: Ottobre 29, 2020, 11:49 »
Si, ma non posso cambiare un programma dove vengono gestiti tanti altri db.
Ho controllato in giro ed ho visto taaante opzioni per trasformare i db in modo che supportino utf8mb4, ho anche creato nuovi db con questa opzione, ma non riesco a convertirlo nella fase di scrittura. Ho anche provato ad inserire questi caratteri da tastiera, ma niente. Il programma è Mariadb 10.1.25 per linux ed io una volta ci sono riuscito, ma non ricordo come ho fatto.....

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.144
  • Punti reputazione: 9
    • Mostra profilo
Re:Memorizzazione emoticon su Mariadb
« Risposta #7 il: Ottobre 29, 2020, 13:23 »
è il driver che conta, direi..

Offline sergio59

  • python unicellularis
  • *
  • Post: 19
  • Punti reputazione: 0
    • Mostra profilo
Re: Memorizzazione emoticon su Mariadb
« Risposta #8 il: Ottobre 29, 2020, 22:12 »
Bene, ho risolto ;).
Dunque questo che ho fatto si applica a Mariadb server 10.1.25

Ho seguito principalmente le indicazioni di questa guida https://mathiasbynens.be/notes/mysql-utf8mb4 ma ho soprattutto inizializzato il database in questo modo
cursor.execute('CREATE DATABASE IF NOT EXISTS %s DEFAULT CHARSET = utf8mb4 DEFAULT COLLATE = utf8mb4_unicode_ci;'%db_tableTelegram)


Nelle tabelle ho fatto la stessa cosa, inserendo alla fine della creazione
ENGINE=InnoDB DEFAULT CHARSET = utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci


ma il comando essenziale è che, quando apri il database, oltre al nome dell'host, utente, password, deve essere inserito il comando charset="utf8mb4"  alla fine del comando di connessione
MySQLdb.connect(host = host_conTelegram, user = user_conTelegram, passwd = password_conTelegram,db = db_tableTelegram, charset="utf8mb4")


e soprattutto i comando per settare il database in utf8mb4 https://dev.mysql.com/doc/refman/5.5/en/option-files.html

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

In questo modo, collegandomi al server e leggendo le righe memorizzate, si vedono le emoticon dentro il database.

Spero che questo serva a qualcun'altro

Sergio

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.144
  • Punti reputazione: 9
    • Mostra profilo
Re:[RISOLTO]Memorizzazione emoticon su Mariadb
« Risposta #9 il: Ottobre 30, 2020, 11:48 »
E quindi il driver è "MySqlDB"... il pezzo di informazione che cercavamo disperatamente di conoscere da nove post...
e adesso che finalmente ce l'abbiamo, possiamo fare questa cosa inconsueta... leggere la documentazione di MySqlDb.
https://mysqlclient.readthedocs.io/user_guide.html#functions-and-attributes
e troviamo le spiegazioni del caso (sia pure scritte in modo un po' criptico, devo dire... mah...)

Offline sergio59

  • python unicellularis
  • *
  • Post: 19
  • Punti reputazione: 0
    • Mostra profilo
Re:[RISOLTO]Memorizzazione emoticon su Mariadb
« Risposta #10 il: Ottobre 30, 2020, 12:16 »
Guarda che nel post n°7 c'è scritto che il db è Mariadbe, e se era così importante perchè non  chiederlo?

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.144
  • Punti reputazione: 9
    • Mostra profilo
Re:[RISOLTO]Memorizzazione emoticon su Mariadb
« Risposta #11 il: Ottobre 30, 2020, 17:59 »
Uhm... non ti è molto chiara la differenza tra un database e un driver python per quel database, vero?
E sì, te lo avevo chiesto...
comunque l'importante è che un po' a martellate tu l'abbia aggiustata...