Skip to content

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:

text
Nome: shop
Character set: utf8mb4
Collation: utf8mb4_unicode_ci

Il significato dei due valori dipende dal motore:

MotoreSet di caratteriCollation
MySQL / MariaDBSet di caratteri predefinito del databaseCollation predefinita
PostgreSQLEncoding (es. UTF8)datcollate, la localizzazione con cui si ordina il testo
SQL ServerCode page della collation (es. CP1250, UTF-8 (CP65001))Collation del database
SQLitePRAGMA encodingBINARY

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:

  1. cambia il valore predefinito del database (ALTER DATABASE … CHARACTER SET … COLLATE …), così le tabelle create da ora in poi ricevono il nuovo set;
  2. converte le tabelle una alla volta con ALTER TABLE … CONVERT TO CHARACTER SET …, che cambia il set predefinito della tabella e ogni colonna CHAR, VARCHAR, TEXT, ENUM e SET.

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:

  1. 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>.sql nella cartella Download. Se una di esse non si può leggere, non viene modificato nulla.
  2. Viene creato il nuovo database con lo stesso set di caratteri e la stessa collation.
  3. 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.
  4. Procedure e funzioni, viste, trigger ed eventi vengono ricreati nel nuovo database. I riferimenti scritti come `vecchio`.tabella puntano al nuovo nome. I trigger mantengono l'ordine di esecuzione e il sql_mode con cui sono stati creati.
  5. I privilegi degli utenti sul database, sulle sue tabelle e routine vengono copiati sul nuovo nome.
  6. 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.