Come modificare le regole di confronto predefinite di una tabella?


187
create table check2(f1 varchar(20),f2 varchar(20));

crea una tabella con le regole di confronto predefinite latin1_general_ci;

alter table check2 collate latin1_general_cs;
show full columns from check2;

mostra le singole regole di confronto delle colonne come 'latin1_general_ci'.

Quindi qual è l'effetto del comando alter table?



Potresti voler modificare la risposta corretta come me stesso e molti altri sembrano concordare sul fatto che la seconda sia quella corretta.
Ahi Tuna,

Risposte:


597

Per modificare il set di caratteri predefinito e le regole di confronto di una tabella incluse quelle delle colonne esistenti (notare la clausola convert in ):

alter table <some_table> convert to character set utf8mb4 collate utf8mb4_unicode_ci;

Modificata la risposta, grazie alla richiesta di alcuni commenti:

Dovrebbe evitare di raccomandare utf8. Non è quasi mai quello che vuoi e spesso porta a pasticci inaspettati. Il set di caratteri utf8 non è completamente compatibile con UTF-8. Il set di caratteri utf8mb4 è quello che vuoi se vuoi UTF-8. - Rich Remer, 28 marzo 18 alle 23:41

e

Sembra abbastanza importante, felice di aver letto i commenti e grazie @RichRemer. Nikki, penso che dovresti modificarlo nella tua risposta considerando quante visualizzazioni questo ottiene. Vedi qui https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html e qui Qual è la differenza tra i caratteri utf8mb4 e utf8 in MySQL? - Paulpro 12 marzo alle 17:46


4
Quali sono le implicazioni della modifica del set di caratteri predefinito? Aggiorna i dati esistenti e quindi deve scorrere la tabella ed effettuare aggiornamenti, bloccarli, ecc.?
concedi il

utf8_binè meglio, no? Qual è la differenza tra utf8_bine utf8_unicode_ci?
Jasom Dotnet il

1
Questo è solo un esempio che ho usato. La differenza è che distingue utf8_bintra maiuscole e minuscole e che non distingue tra maiuscole e utf8_unicode_ciminuscole. Uno non è necessariamente migliore dell'altro: usa ciò che soddisfa le tue esigenze.
Nikki Erwin Ramirez,

12
@JasomDotnet ora si dovrebbe usare utf8mb4_unicode_ci stackoverflow.com/questions/766809/...
baptx

2
Dovrebbe evitare di raccomandare utf8. Non è quasi mai quello che vuoi e spesso porta a pasticci inaspettati. Il utf8set di caratteri non è completamente compatibile con UTF-8. Il utf8mb4set di caratteri è quello che vuoi se vuoi UTF-8.
Rich Remer,

34

MySQL ha 4 livelli di confronto: server, database, tabella, colonna. Se si modificano le regole di confronto del server, del database o della tabella, non si modificano le impostazioni per ciascuna colonna, ma si modificano le regole di confronto predefinite.

Ad esempio, se si modifica il confronto predefinito di un database, ogni nuova tabella creata in quel database utilizzerà tale confronto e, se si modifica il confronto predefinito di una tabella, ogni colonna creata in tale tabella otterrà tale confronto.


8
In effetti, MySQL ha CINQUE livelli di confronto, esiste un'impostazione di confronto predefinita a livello di set di caratteri che molte persone dimenticano.
Devy,

6
C'è anche un confronto delle connessioni show variables like "collation%";, quindi il totale è SIX .
Dzmitry Lazerka,

9

Imposta le regole di confronto predefinite per la tabella; se crei una nuova colonna, che dovrebbe essere fascicolata con latin_general_ci - penso. Prova a specificare le regole di confronto per la singola colonna e verifica se funziona. MySQL ha un comportamento davvero bizzarro per quanto riguarda il modo in cui lo gestisce.


3

potrebbe essere necessario modificare SCHEMA non solo la tabella

ALTER SCHEMA `<database name>`  DEFAULT CHARACTER SET utf8mb4  DEFAULT COLLATE utf8mb4_unicode_ci (as Rich said - utf8mb4);

(mariaDB 10)


<database name>invece di<table name>
dnivog

1
Vedi il mio commento sulla risposta accettata perché non dovresti raccomandarlo utf8, ma utf8mb4.
Rich Remer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.