Database
Con il clic destro su un database nella barra laterale trovi le sue proprietà, il cambio del set di caratteri e la rinomina.
Proprietà del database
Proprietà database mostra il nome del database, il set di caratteri predefinito e la collation. Ogni valore ha un pulsante Copia, e Copia tutto mette tutti e tre negli appunti in una volta:
Nome: shop
Character set: utf8mb4
Collation: utf8mb4_unicode_ciIl significato dei due valori dipende dal motore:
| Motore | Set di caratteri | Collation |
|---|---|---|
| MySQL / MariaDB | Set di caratteri predefinito del database | Collation predefinita |
| PostgreSQL | Encoding (es. UTF8) | datcollate, la localizzazione con cui si ordina il testo |
| SQL Server | Code page della collation (es. CP1250, UTF-8 (CP65001)) | Collation del database |
| SQLite | PRAGMA encoding | BINARY |
Cambiare set di caratteri e collation
Su MySQL e MariaDB la finestra delle proprietà ha Cambia set di caratteri…. Scegli il set di caratteri — la collation passa a quella predefinita del set, e puoi sceglierne un'altra.
Con Applica anche a tutte le tabelle e i campi del database attivo (predefinito) la modifica non si ferma al valore predefinito del database. La finestra conta tabelle e campi di testo e mostra quante tabelle vanno davvero convertite; quelle che hanno già la collation scelta vengono saltate.
Applica chiede conferma, poi:
- cambia il valore predefinito del database (
ALTER DATABASE … CHARACTER SET … COLLATE …), così le tabelle create da ora in poi ricevono il nuovo set; - converte le tabelle una alla volta con
ALTER TABLE … CONVERT TO CHARACTER SET …, che cambia il set predefinito della tabella e ogni colonnaCHAR,VARCHAR,TEXT,ENUMeSET.
Una barra di avanzamento mostra quale tabella si sta convertendo. Ferma interrompe dopo la tabella in corso. Una tabella che fallisce non blocca le altre; alla fine ogni errore è elencato con il nome della tabella.
Le chiavi esterne su colonne di testo non sono un ostacolo: ogni conversione avviene con il controllo delle chiavi esterne disattivato, quindi una tabella figlia può cambiare prima della tabella padre. Le chiavi restano al loro posto e vengono applicate come prima.
Ogni tabella viene ricostruita
CONVERT TO riscrive la tabella e la tiene bloccata per tutta la durata, il che su una tabella grande richiede tempo. Passare a un set multibyte come utf8mb4 può anche trasformare una colonna TEXT in MEDIUMTEXT per mantenerne la capacità. Prima esegui un backup.
Le viste non hanno colonne proprie e non vengono convertite. Procedure e funzioni mantengono la collation con cui sono state create; ricreale se devono usare quella nuova.
PostgreSQL, SQL Server e SQLite mostrano i valori in sola lettura: nessuno di loro può cambiarli in modo sicuro su un database esistente.
Rinominare un database
Rinomina database… si trova nel menu del clic destro sul database per MySQL, MariaDB, PostgreSQL e SQL Server. Un database SQLite è un file — rinominalo modificando la connessione.
PostgreSQL e SQL Server
Entrambi rinominano con un'unica istruzione (ALTER DATABASE … RENAME TO e ALTER DATABASE … MODIFY NAME). Tabelle, altri oggetti e permessi restano dove sono.
Per farlo il server vuole il database tutto per sé. La finestra mostra quante altre sessioni lo usano, e Disconnetti le altre sessioni le chiude prima — le loro transazioni aperte vengono annullate. Le proprie connessioni al database NabuSQL le chiude da solo.
Su SQL Server i file fisici (.mdf, .ldf) mantengono il loro nome.
MySQL e MariaDB
MySQL e MariaDB non hanno un'istruzione per questo, quindi NabuSQL ricostruisce il database con il nuovo nome. La finestra spiega i passaggi ed elenca cosa contiene il database, e il pulsante Rinomina resta disattivato finché non spunti Comprendo il rischio e ho un backup del database.
Cosa succede:
- Tutte le definizioni che non si possono spostare — trigger, viste, procedure, funzioni, eventi, privilegi — vengono lette per prime e salvate in
nabusql_rename_<database>_<ora>.sqlnella cartella Download. Se una di esse non si può leggere, non viene modificato nulla. - Viene creato il nuovo database con lo stesso set di caratteri e la stessa collation.
- I trigger vengono eliminati (MySQL non sposta una tabella che ne ha uno), poi tutte le tabelle si spostano con un unico
RENAME TABLE. È veloce — cambiano solo i metadati, le righe non vengono copiate. - Procedure e funzioni, viste, trigger ed eventi vengono ricreati nel nuovo database. I riferimenti scritti come
`vecchio`.tabellapuntano al nuovo nome. I trigger mantengono l'ordine di esecuzione e ilsql_modecon cui sono stati creati. - I privilegi degli utenti sul database, sulle sue tabelle e routine vengono copiati sul nuovo nome.
- Solo se tutti i passaggi sono riusciti vengono revocati i vecchi privilegi ed eliminato il vecchio database, ormai vuoto.
Se il passaggio 3 fallisce, viene annullato: i trigger vengono ricreati e il nuovo database rimosso. Se qualcosa fallisce dopo lo spostamento delle tabelle, il vecchio database viene mantenuto con ciò che non è stato possibile ricreare, e il risultato elenca ogni passaggio con il suo stato.
Non atomico, e nulla al di fuori di questo database cambia
Viste, routine e trigger in altri database e le applicazioni che si collegano al vecchio nome continuano a usarlo. Durante la rinomina nessun altro dovrebbe lavorare sul database.
Quando l'account del DEFINER non esiste o non hai il privilegio per usarlo, l'oggetto viene creato con te come proprietario, e il risultato lo segnala.
Cosa aggiorna NabuSQL al posto tuo
Dopo ogni rinomina NabuSQL sposta i propri riferimenti sul nuovo nome: query salvate, schede aperte, attività del Task Scheduler, database predefinito della connessione e cartella delle query salvate su disco.
