SMsoft – informatica e dintorni

varie su OSX, GNU/Linux e l'Open Source

Mysql e duplicate entry

Provando ad effettuare una query di INSERT in una tabella in cui sono definite delle chiavi uniche, è possibile che MySQL visualizzi il classico errore di “duplicate entry” relativo al tentativo di inserire un record che contiene dei campi già presenti in altri record del database.
In questo caso, basta modificare la query:
INSERT INTO table VALUES ()
con
INSERT IGNORE INTO table VALUES ()

A vista d’occhio avrete notato che il tutto ruota intorno alla clausola IGNORE che va aggiunta tra INSERT ed INTO

enjoy

MySQL: Reset della password di root dimenticata

E’ possibile che la password dell’utente root su MySQL sia andata persa. E’ possibile reimpostarla in modo abbastanza semplice, seguendo la procedura:

- spegnere MySQL:

 bash |  copy code |? 
1
/etc/init.d/mysql stop

- avviare in safe mode:
 bash |  copy code |? 
1
mysqld_safe --skip-grant-tables &

- accedere come root e senza password (grazie al fatto che siamo in safe mode)
 bash |  copy code |? 
1
mysql -uroot

- accedere alla tabella mysql dove sono presenti i dati di accesso:
 bash |  copy code |? 
1
use mysql;

- aggiornare la password di root (nel nostro esempio con xxxx):
 bash |  copy code |? 
1
update user set password=PASSWORD("xxxx") where User='root';

- fare un flush dei privilegi:
 bash |  copy code |? 
1
flush privileges;

- uscire da mysql:
 bash |  copy code |? 
1
quit

- riavviare mysql normalmente:
 bash |  copy code |? 
1
/etc/init.d/mysql restart

A questo punto si potrà accedere con la nuova password:
mysql -uroot -pxxxx

enjoy

Velocizzare la connessione a MySQL server

Nel caso in cui la connessione ad un server MySQL sembri lenta, o meglio nel caso in cui la procedura di autenticazione presso il server MySQL risulti lenta, è possibile effettuare una piccola modifica al file di configurazione per velocizzare il tutto.
ATTENZIONE: questo non significa che il server MySQL sarà più veloce nell’esecuzione di query, ma solo che la procedura di autenticazione sarà più veloce.

Facciamo un esempio pratico per capire meglio. Digitiamo dalla console:

 bash |  copy code |? 
1
date; mysql -h 10.109.7.16 -uroot; date

verrà visualizzato come risposta:
 bash |  copy code |? 
1
Mar 18 Mar 2010 10:58:07 CET
2
ERROR 1130 (HY000): Host '10.113.10.208' is not allowed to connect to this MySQL server
3
Mar 18 Mar 2010 10:58:17 CET

come vedete il server impiega circa 10 secondi per dirmi che non ho i privilegi di accesso.

A questo punto, modifichiamo il file di configurazione (generalmente /etc/my.cnf) aggiungendo nella sezione mysqld la direttiva skip-name-resolve, es:
[mysqld]
.....
......
skip-name-resolve

Ora riavviate mysql e poi riprovate con:

 bash |  copy code |? 
1
date; mysql -h 10.109.7.16 -uroot; date

e questa volta verrà visualizzato come risposta:
 bash |  copy code |? 
1
Mar  18 Mar 2010 10:59:39 CET
2
ERROR 1130 (HY000): Host '10.113.10.208' is not allowed to connect to this MySQL server
3
Mar  18 Mar 2010 10:59:39 CET

ecco, ora la risposta è praticamente immediata.

Enjoy

Aggiungere e rimuovere un utente MySQL

Vi segnalo le query da eseguire per creare/eliminare un utente MySQL al volo. Le query vanno eseguite chiaramente dopo essersi connessi a MySQL con un utente che ha i privilegi di creare altri utenti.

Creazione utente

1
GRANT ALL PRIVILEGES ON *.* TO 'nome_utente'@'10.0.0.1' IDENTIFIED BY 'password' WITH GRANT OPTION;

Gli elementi da variare in base alle vostre esigenze sono:
*.* = ovvero nome_db.tabella_db a cui dare i privilegi (usare *.* per consentire l’accesso a qualsiasi database/tabella)
nome_utente = ovvero l’username del nuovo utente
10.0.0.1 = ovvero l’IP da cui l’utente si connette (usare % per consentire l’accesso da qualsiasi IP)
password = ovvero la password relativa al nuovo utente

Eliminazione utente
1
DROP USER 'nome_utente'@'10.0.0.1';

Gli elementi da variare questa volta sono:
nome_utente = ovvero l’username da rimuovere
10.0.0.1 = ovvero l’IP da cui l’utente si connetteva

Simulare la clausola LIMIT di MySQL in ORACLE

Se avete provato ad utilizzare la clausola LIMIT, a cui siete abituati in MySQL, in una query inviata ad Oracle vi sarete accorti che non funziona…
Tale clausola infatti non esiste in Oracle, ma può essere implementata come segue:

select *
from ( select a.*, rownum rname
          from TABLE a
       where rownum <= MAX_ROWS )
 where rname >= MIN_ROWS;

dove:
TABLE: qui inserire nome_tabella
MAX_ROWS: qui inserire il limite superiore
MIN_ROWS: qui inserire il limite inferiore

Faccio un esempio pratico. Seleziono nome e cognome dalla tabella clienti, ordintati per data, dal numero 1000 al numero 2000

SELECT * FROM
      (SELECT nome,cognome, ROWNUM rname FROM clienti
        WHERE ROWNUM<=2000 ORDER BY data)
     WHERE rname >=1000

Capisco che non sia proprio la stessa cosa, ma in molti casi può aiutare ;-)

enjoy

amfphp, Flex ed i caratteri accentati

Mi sono imbattuto nello sviluppo di uno script PHP per interfacciare Flex con un database MySQL ed ho riscontrato problemi con la lettura ed il salvataggio di lettere accentate.

Dopo un pò di prove ho trovato la soluzione ottimale e la cosa è davvero semplice. Basta aggiungere le seguenti righe nello script PHP, subito dopo aver effettuato la connessione al database(quindi dopo la funzione mysql_connect()):

 php |  copy code |? 
1
$sql = 'SET CHARACTER SET utf8';
2
$res = mysql_query($sql);

Fatto questo, sono riuscito a leggere e scrivere caratteri accentanti senza alcun problema nel DB MySQL.

NOTA: solo una piccola precisazione, ma sicuramente è superflua. I campi nel DB MySQL  hanno come collation utf8_general_ci
NOTA2: ho letto alcuni post che consigliano anche di modificare la riga 127 del file gateway.php di amfphp da:

 php |  copy code |? 
127
$gateway->setCharsetHandler( "utf8_decode", "ISO-8859-1","ISO-8859-1" );

a

 php |  copy code |? 
127
$gateway->setCharsetHandler( "none", "ISO-8859-1","ISO-8859-1" );

Page optimized by WP Minify WordPress Plugin