Jak zmienić domyślne sortowanie tabeli?

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

tworzy tabelę z domyślnym zestawieniem latin1_general_ci;

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

pokazuje indywidualne zestawienie kolumn jako „latin1_general_ci”.

Jaki jest zatem efekt polecenia alter table?

simplfuzz
źródło
możliwy duplikat zestawienia bazy danych zmian
Michel Ayres
Możesz zmienić poprawną odpowiedź, ponieważ ja i wielu innych zgadzam się, że druga odpowiedź jest poprawna.
Ahi Tuna

Odpowiedzi:

597

Aby zmienić domyślny zestaw znaków i zestawienie tabeli, w tym tabel istniejących kolumn (zwróć uwagę na klauzulę konwersji na klauzulę):

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

Edytowałem odpowiedź, dzięki podpowiedziom niektórych komentarzy:

Powinien unikać zalecania utf8. Prawie nigdy nie jest to, czego chcesz i często prowadzi do nieoczekiwanych bałaganu. Zestaw znaków utf8 nie jest w pełni kompatybilny z UTF-8. Zestaw znaków utf8mb4 jest tym, czego chcesz, jeśli chcesz UTF-8. - Rich Remer 28 marca 18 o 23:41

i

To wydaje się dość ważne, cieszę się, że przeczytałem komentarze i dziękuję @RichRemer. Nikki, myślę, że powinieneś to zmienić w swojej odpowiedzi, biorąc pod uwagę liczbę wyświetleń. Zobacz tutaj https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html i tutaj Jaka jest różnica między zestawami znaków utf8mb4 i utf8 w MySQL? - Paulpro 12 marca o 17:46

Nikki Erwin Ramirez
źródło
4
Jakie są konsekwencje zmiany domyślnego zestawu znaków? Czy aktualizuje istniejące dane i dlatego musi przeglądać tabelę i dokonywać aktualizacji, blokować ją itp.?
udziel
utf8_binjest lepiej, prawda? Jaka jest różnica między utf8_bini utf8_unicode_ci?
Jasom Dotnet
1
To tylko przykład, którego użyłem. Różnica polega na tym, że utf8_binrozróżnia się małe i utf8_unicode_ciwielkie litery. Jedno niekoniecznie jest lepsze od drugiego - używaj tego, co odpowiada Twoim potrzebom.
Nikki Erwin Ramirez
12
@JasomDotnet powinieneś teraz użyć utf8mb4_unicode_ci stackoverflow.com/questions/766809/…
baptx
2
Powinien unikać zalecania utf8. Prawie nigdy nie jest to, czego chcesz i często prowadzi do nieoczekiwanych bałaganu. Zestaw utf8znaków nie jest w pełni kompatybilny z UTF-8. Zestaw utf8mb4znaków jest tym, czego chcesz, jeśli chcesz UTF-8.
Rich Remer
34

MySQL ma 4 poziomy sortowania: serwer, baza danych, tabela, kolumna. Jeśli zmienisz sortowanie serwera, bazy danych lub tabeli, nie zmienisz ustawienia dla każdej kolumny, ale zmienisz domyślne sortowania.

Np. Jeśli zmienisz domyślne sortowanie bazy danych, każda nowa tabela utworzona w tej bazie danych będzie używać tego sortowania, a jeśli zmienisz domyślne sortowanie tabeli, każda kolumna utworzona w tej tabeli otrzyma to zestawienie.

Fredrik
źródło
8
W rzeczywistości MySQL ma PIĘĆ poziomów sortowania, istnieje domyślne ustawienie sortowania na poziomie zestawu znaków, o którym wiele osób zapomina.
Devy
6
Istnieje również zestawianie połączeń show variables like "collation%";, więc w sumie jest SZEŚĆ .
Dzmitry Lazerka
9

Ustawia domyślne sortowanie dla tabeli; jeśli utworzysz nową kolumnę, powinna ona zostać zestawiona z latin_general_ci - tak myślę. Spróbuj określić sortowanie dla pojedynczej kolumny i sprawdź, czy to zadziała. MySQL zachowuje się naprawdę dziwnie, jeśli chodzi o sposób, w jaki sobie z tym radzi.

Don Werve
źródło
3

być może konieczna będzie zmiana tabeli SCHEMA nie tylko

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

(mariaDB 10)

AssyK
źródło
<database name>zamiast<table name>
dnivog
1
Zobacz mój komentarz do zaakceptowanej odpowiedzi, dlaczego nie powinieneś polecać utf8, ale utf8mb4.
Rich Remer