Nasz poprzedni programista ustawił niewłaściwe sortowanie w tabeli (MySQL). Skonfigurował to z łączeniem łacińskim, kiedy powinno to być UTF8, a teraz mam problemy. Każdy rekord ze znakami chińskimi i japońskimi zamienia się w ??? postać.
Czy można zmienić sortowanie i odzyskać szczegóły postaci?
Odpowiedzi:
zmień sortowanie w bazie danych:
zmiana sortowania tabeli:
zmień sortowanie kolumn:
Co
utf8mb4_0900_ai_ci
oznaczają poszczególne części ?Więcej informacji:
źródło
CHARACTER SET utf8
będzie domyślnie,utf8_general_ci
ale wALTER DATABASE <database_name> CHARACTER SET utf8 COLLATE utf8_unicode_ci;
razie potrzeby możesz również zdefiniować sortowanie w ten sposóbcreate table testit(a varchar(1)); show create table testit \G drop table testit;
utf8_general_ci
; jeśli chcesz go zmienićutf8_unicode_ci
, można zdefiniować sortowania:ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
. Działa to na tabelach dokładnie tak samo, jak na bazach danych, jak wskazał @KCD.ALTER DATABASE <database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
. Powinieneś zrobić to samo dla pozostałych dwóch instrukcji.Oto jak zmienić wszystkie bazy danych / tabele / kolumny. Uruchom te zapytania, a wyświetlą wszystkie kolejne zapytania niezbędne do konwersji całego schematu na utf8. Mam nadzieję że to pomoże!
- Zmień domyślne sortowanie bazy danych
- Zmień zestawienie tabel / znaków
- Zmień zestawienie COLUMN / Char Set
źródło
Pamiętaj, że w MySQL
utf8
zestaw znaków jest tylko podzbiorem prawdziwego zestawu znaków UTF8. Aby zaoszczędzić jeden bajt pamięci, zespół Mysql zdecydował się na przechowywanie tylko trzech bajtów znaków UTF8 zamiast pełnych czterech bajtów. Oznacza to, że niektóre języki wschodnioazjatyckie i emoji nie są w pełni obsługiwane. Aby upewnić się, że możesz przechowywać wszystkie znaki UTF8, użyjutf8mb4
typu danych iutf8mb4_bin
lubutf8mb4_general_ci
w MySQL.źródło
utf8mb4_unicode_ci
zamiastutf8mb4_general_ci
. Zobacz stackoverflow.com/questions/766809/… i drupal.stackexchange.com/questions/166405/…Dodając do tego, co napisał David Whittaker, utworzyłem zapytanie, które generuje kompletną instrukcję zmiany tabeli i kolumn, która konwertuje każdą tabelę. Bieganie może być dobrym pomysłem
USTAW SESJĘ group_concat_max_len = 100000;
najpierw upewnij się, że konkat grupowy nie przekracza bardzo małego limitu, jak widać tutaj .
Różnica między poprzednią odpowiedzią polega na tym, że użycie utf8 zamiast ut8mb4 i użycie t1.data_type z t1.CHARACTER_MAXIMUM_LENGTH nie działa w przypadku wyliczeń. Ponadto moje zapytanie wyklucza widoki, ponieważ będą one musiały zostać zmienione osobno.
Po prostu użyłem skryptu Perla, aby zwrócić wszystkie te zmiany jako tablicę i iterowałem po nich, poprawiłem kolumny, które były zbyt długie (ogólnie były to varchar (256), kiedy dane miały zwykle tylko 20 znaków, więc była to łatwa poprawka ).
Odkryłem, że niektóre dane były uszkodzone podczas zmiany z latin1 -> utf8mb4. Wyglądało na to, że znaki latin1 zakodowane w utf8 w kolumnach zostałyby oszukane podczas konwersji. Po prostu trzymałem dane z kolumn, o których wiedziałem, że będą problemem w pamięci przed i po zmianie, porównałem je i wygenerowałem instrukcje aktualizacji, aby naprawić dane.
źródło
tutaj dobrze opisuje proces. Jednak niektóre postacie, które nie pasowały do przestrzeni łacińskiej, zniknęły na zawsze. UTF-8 to SUPERSET z latin1. Nie na odwrót. Większość z nich zmieści się w przestrzeni jednobajtowej, ale żadne niezdefiniowane nie (sprawdź listę latin1 - nie wszystkie 256 znaków są zdefiniowane, w zależności od definicji latin1 mysql)
źródło