Visualizzazione post con etichetta mysql. Mostra tutti i post
Visualizzazione post con etichetta mysql. Mostra tutti i post

martedì 6 marzo 2018

Leggi il post

MYSQL: query tra database diversi

Se hai alberato la struttura dei tuoi dati in database diversi, devi sapere che in mysql è possibile compiere query multidatabase, ovvero tra un database ed un altro.
Mettiamo ad esempio di avere tutto un elenco di nominativi dentro una tabella in un database specifico, e di avere invece i corrispettivi indirizzi in un'altra tabella, ma in un diverso database, ecco che sapere la giusta sintassi per agganciare questi due db può sicuramente fare la differenza in termini di semplicità di query, ma anche di prestazioni.

Vediamo dunque come pescare dati da tabelle su database diversi con mysql.


Come fare query tra database diversi in mysql


Per poter legare i dati presenti in tabelle su database diversi, ecco la sintassi da utilizzare in mysql:

SELECT t1.campo,t2.campo FROM database1.tabella1 AS t1, database2,tabella2 AS t2

La sintassi dunque per poter pescare i dati da un database ad un altro, è semplicemente: database.nometabella.
Tra l'altro, visto che già ci troviamo sul primo database, non è necessario richiamare la tabella con il prefisso del db in cui ci si trova, ma si può farlo solo per collegarsi al secondo db.

Per facilitare le query, o per meglio dire, per renderle meno lunghe, è molto utile dare un'abbreviazione alle tabelle usate, con il comando AS nomecorto.
Quest'abbreviazione può essere usata sia nella select, ma anche e soprattutto nella WHERE dove vengono inserite le condizioni necessarie per legare le due tabelle.

Bene, ora sai come fare select su database diversi in mysql.
Ovviamente, un filino tutto ciò influisce sulle prestazioni, rispetto ad avere le tabelle già nello stesso db, ma parliamo veramente di una manciata di millisecondi.

lunedì 12 febbraio 2018

Leggi il post

MYSQL: impedire inserimento duplicati

Quando si progetta un'applicazione che si appoggia al database mysql, a volte conviene non lasciare la gestione delle tabelle al 100% allo script php (o in qualsiasi linguaggio il sito o l'app sia realizzata).
Ad esempio, se voglio essere sicuri al 100% che nessuno possa mai inserire dei record doppi, occorre lavorare sul database più che sull'app.

Vediamo quindi come fare per impedire l'inserimento di record doppi su mysql, utilizzando gli indici, in modo tale da impedire fisicamente qualsiasi operazione di inserimento di duplicati da parte di un sito web che si collega al nostro db sql.


Come impedire l'inserimento duplicati in MYSQL


Per bloccare a monte l'inserimento di record doppi in una tabella mysql, occorre usare gli indici.
Grazie agli indici di mysql infatti, è possibile evitare che un record venga inserito più volte.
Occorre individuare il campo o i campi che devono essere univoci, e creargli sopra un indice.

Vediamo subito la sintassi da utilizzare per aggiungere un indice univoco:

ALTER TABLE nome-tabella ADD UNIQUE(`nome-campo`);

Con questa semplice riga di codice sql infatti, avremo assegnato un indice univoco al campo desiderato.
Da ora in avanti dunque, non sarà più possibile inserire per quel campo dei valori uguali.
Il contro di questo metodo, è che ovviamente la tabella deve essere già sistemata prima di creare l'indice univoco, ovvero non devono esistere già dei duplicati nel campo da rendere unico, altrimenti non sarà possibile inserire l'indice.


Come creare un indice univoco con più campi


Ci sono poi dei casi in cui la chiave univoca da creare deve contenere più campi.
Prendiamo ad esempio il caso in cui in una tabella mysql non vogliamo che ci siano dei duplicati di persone che si chiamano nello stesso nome, ovvero facciamo finta di voler bloccare a monte l'inserimento di nome e cognome uguali.
Ecco cosa bisogna scrivere per creare quest'indice univoco multicampo:

ALTER TABLE nome-tabella ADD UNIQUE `nome-cognome` (`nome`, `cognome`);

Avremo così creato un unico indice che contiene due campi, a cui abbiamo anche dato un nome.
Grazie a questo indice sql, se si proveranno ad inserire 2 Mario Rossi, il database mysql genererà un errore del tipo:
"Valore duplicato 'Mario-Rossi' per la chiave 'nome-cognome'".

Bene, con gli indici univoci mysql per oggi è tutto!

giovedì 11 gennaio 2018

Importare database access in mysql

Oggi mi è capitata una nuova esigenza, ovvero quella di dover importare un database access in mysql.
Avendo dunque delle tabelle in microsoft access, la mia necessità era quella di convertire i dati ed importare il tutto dentro un database relazionale online, ovvero mysql.

Cercando sul web ho trovato un tool gratuito che consente di fare ciò, il suo nome è mysql workbench.
Tuttavia però, dopo averci smanettato un po', ho valutato che era molto più semplice importare da access in mysql ogni singola tabella, con un metodo appena scoperto e decisamente rapido e funzionale... vediamo subito quale (cit.).


Come importare un database Access in Mysql


Per poter effettuare la migrazione da access a mysql, senza dover utilizzare alcun programma aggiuntivo, basta procedere nel seguente modo:
  1. Crea un odbc su windows, una fonte dati che ti consentirà di effettuare la connessione a mysql dal tuo pc o dal server su cui eseguirai questa operazione (se non sai come fare leggi questo post)
  2. Apri il tuo file access
  3. Seleziona la tabella che vuoi importare in mysql (non te lo fa fare se ne selezioni più di una purtroppo), e clicca con il tasto destro del mouse
  4. Clicca su Esporta
  5. Clicca su Database ODBC
  6.  Scegli il nome che vuoi dare alla tabella da importare, o lasciala uguale, poi clicca su Ok
  7. Nella finestra che si aprirà, clicca sulla tab Origine dati dal computer
  8. Adesso seleziona la fonte dati precedentemente creata e clicca su Ok

Importare database access in mysql

Nome tabella

selezione fonte dati

import access mysql terminato

Avrai così esportato ed importato in un colpo solo, la tua tabella access dentro mysql.
Ovviamente manterrai tutte le configurazioni precedentemente settate, come il tipo di campo ed eventuali indici.

Certo, se devi importare tante tabelle da access a mysql questo processo potrebbe risultare un filino macchinoso, ma nel caso in cui il numero non sia eccessivamente elevato, con questo metodo avrai fatto un import access mysql in maniera molto semplice e senza programmi aggiuntivi, grazie alla possibilità di esportare le singole tabelle.

Ovviamente, affinchè questa procedura non dia errore, l'utente definito nella fonte dati odbc deve avere anche i permessi di creazione tabelle, e non solo di lettura/scrittura.

martedì 19 dicembre 2017

Leggi il post

Stringa di connessione a Mysql (ODBC / OLEDB)

Per potersi collegare al database mysql da access o da qualsiasi altro strumento che utilizza i driver odbc o il metodo oledb, occorre conoscere la giusta stringa di connessione.
Sto parlando della giusta sintassi da utilizzare per poter far sì che i propri software possano leggere/scrivere dati sulle tabelle di mysql.

In questo breve post illustrerò come fare una stringa di connessione a mysql, in un metodo piuttosto che in un altro


Stringa di connessione MYSQL ODBC


"Provider=MSDASQL; DRIVER={MySQL ODBC 3.51Driver}; SERVER=ip-server; DATABASE=nome-database-mysql; UID=username-mysql; PASSWORD=password-mysql; OPTION=3"

La stringa sopra riportata direi che si spiega da sola.
Ad ogni modo, questa stringa di connessione a mysql è riferita ad una connessione di tipi ODBC, con i driver 3.51 Driver.
Nel caso quindi si utilizzino versioni differenti di driver, basta sostituire il suddetto valore con quello corretto.


Stringa di connessione MYSQL OLEDB


"Provider=MySQLProv;Data Source=nome-database-mysql; User Id=username-mysql; Password=password-mysql;"

Per connettersi a mysql usando l'oledb, un metodo che molti reputano più performante, basta dunque utilizzare la stringa sopra riportata.
Vale lo stesso principio per l'odbc, i dati sono più o meno gli stessi, anche se ad un occhio attento non sarà sfuggito il fatto che manca l'indicazione dell'ip del server mysql a cui collegarsi, che di fatto di default è il localhost.

Se infatti si vuole fare una OleDbConnection (per il framework .net) specificando un server mysql diverso online remoto, ecco una sintassi utilizzabile:

'conn.ConnectionString="provider=MYSQLOLEDB; Driver={MySQL};SERVER=ip-server;DATABASE=nome-database;USER=username;PASSWORD=password"

Bene, direi che con le stringhe di connessione per mysql è tutto :)

mercoledì 13 dicembre 2017

Risolvere errore: mysql odbc got a packet bigger than max_allowed_packet

La connessione tra access e mysql spiegata pochi giorni fa, come immaginavo, ha portato alla creazione di diversi post risolutivi di problemi vari :)
Oggi è venuto il momento di parlare del seguente errore: "mysql odbc got a packet bigger than max_allowed_packet", che altri non è che il dettaglio un errore di operazione update non riuscita su tabella..., errore che poteva anche essere riferito ad un'operazione di Insert.

Ma cosa ho provato a fare per ottenere questo fastidioso messaggio di errore?
Semplice, ho provato a salvare un file allegato su un database mysql, passando dalle maschere di access.

Vediamo dunque come sistemare questa ennesima problematica di compatibilità tra access e mysql... se così si può dire.

mysql odbc got a packet bigger than max_allowed_packet


Come risolvere l'errore: mysql odbc got a packet bigger than max_allowed_packet


Per poter caricare dei file in un database mysql passando da una maschera di microsoft access, occorre innanzitutto essere sicuri che il campo nel database sia sufficientemente grande.
Ad esempio, se il nostro allegato è molto grande, il normale campo blob potrebbe non bastare, quindi occorre creare un campo long blob in mysql.

Allargando le dimensioni del campo del db mysql, da blob a longblob, già si risolvono eventuali problemi di dimensioni massima dei file caricabili, errori che possono dare come risultato su access, un bel errore: "odbc lost connection to mysql server during query", o "mysql server has gone away", oppure ancora, il terribile errore "odbc chiamata non riuscita".

C'è però un'altro parametro che occorre settare/controllare, affinchè non ci siano problemi di caricamento di file pesanti da access a mysql, e si tratta del my.ini, ovvero il file di configurazione di mysql.
Come indicato in un precedente post infatti, l'azione risolutiva è quella di modificare/aggiungere le seguenti linee di codice nel my.ini:

max_allowed_packet = 16M
wait_timeout = 6000


Ora, il 16 mega è un valore indicativo, potrebbe anche non bastare per voi, quindi settate pure il valore più opportuno in base ai file da caricare.
Il timeout invece serve per evitare che la lentezza di connessione possa inficiare negativamente sull'esito dell'operazione.
Tutto ciò, su wamp si trova nella sezione [wampmysqld64], altrimenti la sezione suppongo possa chiamarsi semplicemente [mysqld].

Bene, direi che è tutto.
Spero non insorgano altri problemi nell'utilizzo di mysql da access, altrimenti temo che si faccia prima a sviluppare una bella interfaccia web personalizzata al posto del prodotto della Microsoft :)

martedì 12 dicembre 2017

ODBC Chiamata non riuscita: access / mysql errore RISOLTO

L'altro giorno ho fatto un breve tutorial su come collegare access a mysql, ed eccomi qui subito a farne un altro ancora più breve per spiegare come risolvere l'errore odbc chiamata non riuscita.

E' il caso in cui, dopo aver correttamente configurato la fonte dati sul proprio pc, dopo averla testata con successo, si prova a collegarsi a mysql da access, e si viene bloccati istantaneamente da questo errore "odbc call failed" su access.

Vediamo subito come fare per rimediare a questo problema, che tra l'altro potrebbe presentarsi anche per la connessione da access ad altre fonti dati (es. sql server, oracle).

ODBC Chiamata non riuscita


Come risolvere l'errore ODBC Chiamata non riuscita da access a mysql


Cercando un po' su internet, ho trovato qualche post a riguardo, ma le soluzioni proposte non mi convincevano molto, dato che spesso si parlava di problemi di timeout / latenza.
Ad ogni modo, prima di proporvi la mia soluzione, vi spiegherò brevemente cosa dicono di fare gli altri.

Premesso che do per scontato che abbiate inserito correttamente tutti i parametri di connessione come username, password, ip server, ecc..., e che non ci siano di mezzo terribili firewall, antivirus o proxy a bloccare le chiamate al database mysql, ecco quanto propongono di fare la maggior parte delle persone su internet: modificare il file di configurazione di mysql.

Bisognerebbe infatti andare sul file my.ini e settare i seguenti parametri:

max_allowed_packet = 64M
wait_timeout = 6000


Si tratta quindi di aumentare il numero massimo di pacchetti trasmessi ed il tempo di scadenza delle chiamate.
Se usate wamp, tutto ciò si trova nella sezione [wampmysqld64], dove max_allowed_packet è presente e andrebbe solo variato, mentre wait_timeout va proprio aggiunto.
Dopo aver modificato questi parametri, ricordarsi di riavviare mysql.

Come dicevo però poco sopra, nel mio caso l'errore "odbc chiamata non riuscita" appariva istantaneamente quando provavo a collegare mysql ad access, inoltre se aprivo la fonte dati mysql dal pannello di controllo, questa funzionava correttamente.
Ed infatti con me questa soluzione non ha funzionato.


Funziona: come risolvere errore odbc chiamata non riuscita


Ecco ciò che ha funzionato per me.
E' bastato installare il driver odbc a 32bit al posto che quello a 64 bit, e configurare il tutto di conseguenza.
Nonostante infatti io abbia un pc a 64 bit, e rispettivi programmi a 64 bit, ho dovuto usare una connessione a 32bit... poco male, l'importante è che funzioni.

Ad ogni modo, potrebbe per voi invece non funzionare il 32 ma il 64, quindi fate pure delle prove installando i giusti driver scaricandoli da questo sito internet:

https://dev.mysql.com/downloads/connector/odbc/

Spero che questo breve tutorial sia stato utile a qualcuno.
Probabilmente ci sono anche altre casistiche per cui possa risultare impossibile collegarsi a mysql da access, o da access a sql server, o a oracle (l'errore è generico e potrebbe presentarsi anche durante la connessione ad altri db), ma spero che rientrate in questo caso... dato che è il più facile da risolvere.

lunedì 11 dicembre 2017

Come collegarsi a Mysql da Access

L'altro giorno mi è sorta una nuova esigenza di tipo informatico, un qualcosa che non mi era mai capitato di dover fare, ovvero collegare access a mysql.
Capita che qualcuno abbia più dimestichezza con le maschere di access piuttosto che con phpmyadmin, quindi in questi casi, al posto di fargli usare un'interfaccia web, perchè non gli facciamo utilizzare il suo strumento preferito?

Vediamo dunque come fare per connettere access a mysql, in modo tale da poter eseguire query, leggere, modificare, cancellare dati dalla comoda interfaccia di casa Microsoft.


Come collegarsi a Mysql da Access


La prima cosa da fare per poter utilizzare mysql da access, è quella di scaricare ed installare i driver necessari per poter creare una fonte dati odbc sul computer che deve poter connettersi a mysql, ovvero sul client su cui si deve utilizzare access.
Per far ciò, basta collegarsi al seguente indirizzo:

https://dev.mysql.com/downloads/connector/odbc/

Scegliere la piattaforma su cui installare i driver odbc, in questo caso Microsoft Windows, e poi scegliere se utilizzare la versione 32bit o 64bit.

Come collegarsi a Mysql da Access

Anche se il sito chiede di registrarsi o di fare la login, se si guarda bene la pagina, poco più in basso è possibile proseguire con il download anche senza fare alcuna registrazione, cliccando sul link "No thanks, just start my download".
Comunque, dopo aver installato questi driver, sarete pronti per passare alla fase di configurazione del pc.

Adesso passiamo alla creazione della fonte dati odbc per connettersi al database mysql dal proprio pc, o da quello dell'utente finale.
Seguire i seguenti passaggi:

Pannello di controllo -> Strumenti di amministrazione -> Origine dati ODBC

Qui occorre specificare se 32bit o 64bit, a seconda di quanto scaricato poco prima.

Adesso scegliere se creare un DNS utente o un DNS di sistema, io ho optato per il primo ed ho cliccato su Aggiungi.
Dall'elenco, selezionare la voce MYSQL ODBC Ansi Driver.

MYSQL ODBC Ansi Driver

Adesso compilare i seguenti campi:
  • Data source name: il nome descrittivo che poi ritroverete in access
  • TCP/IP Server: l'indirizzo ip del server, localhost se si trova sulla stessa macchina
  • Port: la porta d'accesso, lasciare pure la 3306
  • User: l'username dell'utente mysql creato da phpmyadmin, che in teoria dovrebbe avere la proprietà % e non localhost, se si vuole poter accedere dall'esterno
  • Password: la password dell'utente mysql
  • Database: il database mysql a cui ci si vuole collegare

Per verificare che tutto funzioni, cliccare su Test, e se il tutto ha un esito positivo, cliccare su Ok per creare l'origine dati.

Test connessione mysql

Bene, ora che la fonte dati è stata creata sul computer che deve potersi collegare a mysql, è finalmente venuto il momento di passare ad Access.

Per potersi collegare da access a mysql, basta seguire questi ultimi passaggi:
  1. Aprire MS Access
  2. Cliccare in alto sul menù Dati esterni
  3. Nella sezione Importa espandere la voce Altro 
  4. Cliccare su Database Odbc

Se poi si utilizza un access più recedente (es. 2016), il percorso potrebbe invece essere:

Dati esterni -> Nuova origine dati -> Da database

Comunque sia, alla fine si arriverà in una finestra dove bisognerà selezionare l'origine dati, cliccando sull'opzione "Collega all'origine dati creando una tabella collegata".

Collega all'origine dati creando una tabella collegata

Si aprirà una nuova finestra dove dover cliccare su Origine dati computer o Origine dati sistema, a seconda del tipo di odbc creato prima.
In questa finestra troverete la connessione dati creata prima, con il nome che gli avevate dato, selezionatela e cliccate su Ok.

Selezionare l'origine dati

Se tutto sarà andato a buon fine, cliccando su ok vi verrà chiesto di selezionare la tabella a cui collegarvi, quindi con un altro ok, avrete connesso access a mysql e potrete vedere gli stessi dati che appaiono su phpmyadmin.

tabella mysql da phpmyadmin

tabella mysql da access

Vista così potrebbe sembrare che aprire una tabella mysql da access sia una cosa semplice, ed in effetti lo è.
Tuttavia è meglio non sottovalutare assolutamente eventuali problemi di compatibilità tra i due database.
Parlo di limite massimo di numero di record di access (255 nelle precedenti versioni), o di dimensione massima del database (2 giga una volta, ora non so).
Quindi se ad esempio in mysql salvate file pesanti, potreste riscontrare qualche problemino nell'aprili/leggerli da access.

A parte questo comunque, grazie a questo tutorial potrete leggere / scrivere su mysql da access, sia che il database sia in locale sullo stesso computer in cui è installato access, sia che sia in remoto su qualche server online.
Direi che è tutto, buone prove di connessione e buona creazione di maschere :)