Jak przekonwertować cały zestaw znaków bazy danych MySQL na UTF-8 i zestawienie na UTF-8?
mysql
character-encoding
Dziekan
źródło
źródło
utf8_unicode_ci
, nieutf8_general_ci
.utf8mb4
zamiast,utf8
ponieważutf8
obsługuje tylko podstawową płaszczyznę wielojęzyczną, a nie pełny zakres. Wymaga MySQL 5.5.3 lub nowszego.utf8mb4
musisz także zmienić sortowanie nautf8mb4_unicode_ci
utf8mb4_unicode_520_ci
lub cokolwiek jest najnowszą dostępną wersją.Odpowiedzi:
Użyj poleceń
ALTER DATABASE
iALTER TABLE
.Lub jeśli nadal korzystasz z MySQL 5.5.2 lub starszego, który nie obsługiwał 4-bajtowego UTF-8, użyj
utf8
zamiastutf8mb4
:źródło
CONVERT TO
Metoda zakłada, że treść została prawidłowo przechowywane w innej kodowania (np latin1) i nie zniekształcone (np UTF-8 bajtów wtłoczone latin1 kolumny bez konwersji latin1).Zrób kopię zapasową!
Następnie musisz ustawić domyślne zestawy znaków w bazie danych. Nie powoduje to konwersji istniejących tabel, a jedynie ustawienie domyślne dla nowo tworzonych tabel.
Następnie musisz przekonwertować zestaw znaków na wszystkich istniejących tabelach i ich kolumnach. Zakłada się, że bieżące dane znajdują się w bieżącym zestawie znaków. Jeśli twoje kolumny są ustawione na jeden zestaw znaków, ale twoje dane są naprawdę przechowywane w innym, musisz sprawdzić instrukcję MySQL, jak sobie z tym poradzić.
źródło
utf8_general_ci
nie jest już zalecaną najlepszą praktyką. Od MySQL 5.5.3 powinieneś używaćutf8mb4
zamiastutf8
. Oba odnoszą się do kodowania UTF-8, ale starszeutf8
miały specyficzne dla MySQL ograniczenie uniemożliwiające użycie znaków o numerach powyżej0xFFFD
.W powłoce wiersza poleceń
Jeśli jesteś jednym z wiersza poleceń, możesz to zrobić bardzo szybko. Wystarczy wpisać „dbname”: D
Jednowarstwowy do prostego kopiowania / wklejania
źródło
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DB="dbname"
DB="db_name"; ( echo 'ALTER DATABASE
'"$ DB"' 'ZNAK ZESTAWU utf8 COLLATE utf8_general_ci;'; mysql --uuser -ppassword -hhost "$ DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I {} echo 'SET Foreign_key_checks = 0; ALTER TABLE'{}'
CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ' ) | mysql -uuser -ppassword -hhost "$ DB" 'Możesz utworzyć sql, aby zaktualizować wszystkie tabele za pomocą:
Przechwyć wyjście i uruchom je.
Powyższa odpowiedź Arnolda Danielsa jest bardziej elegancka.
źródło
WHERE TABLE_SCHEMA=webdb_playground
co wystąpił błąd nieznanej kolumny, aleWHERE TABLE_SCHEMA="webdb_playground"
byłby udany. Coś, co można wypróbować na wypadek, gdyby ktoś wpadł na to.Przed kontynuowaniem upewnij się, że: Wykonałeś pełną kopię zapasową bazy danych!
Krok 1: Zmiany na poziomie bazy danych
Identyfikacja zestawu zestawień i znaków w bazie danych
Naprawianie sortowania dla bazy danych
Krok 2: Zmiany na poziomie stołu
Identyfikacja tabel bazy danych z niepoprawnym zestawem znaków lub zestawieniem
Dostosowywanie zestawiania kolumn tabeli i zestawu znaków
Przechwyć górne wyjście SQL i uruchom je. (jak obserwowanie)
patrz: https://confluence.atlassian.com/display/CONFKB/How+to+Fix+the+Collation+and+Character+Set+of+a+MySQL+Database
źródło
Użyj HeidiSQL . Jest to bezpłatne i bardzo dobre narzędzie db.
Z menu narzędzi przejdź do edytora tabel zbiorczych
Wybierz całą bazę danych lub wybierz tabele do konwersji,
Wykonać
Konwertuje to kompletną bazę danych z łacińskiego na utf8 w zaledwie kilka sekund.
Działa jak marzenie :)
HeidiSQL łączy się domyślnie jako utf8, więc wszelkie znaki specjalne powinny być teraz postrzegane jako znak (æ ø å), a nie jako zakodowane podczas sprawdzania danych tabeli.
Prawdziwą pułapką przy przechodzeniu z łaciny na utf8 jest upewnienie się, że pdo łączy się z zestawem znaków utf8. Jeśli nie, dane śmieci zostaną wstawione do tabeli utf8 i znaki zapytania w dowolnym miejscu na swojej stronie internetowej, co sprawi, że myślisz, że dane tabeli nie są utf8 ...
źródło
Inspirowany komentarzem @sdfor, oto skrypt bash, który wykonuje zadanie
źródło
Jeśli dane nie są w tym samym zestawie znaków, możesz rozważyć ten fragment kodu ze strony http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html
Oto przykład:
Upewnij się, że wybierasz odpowiednie sortowanie, w przeciwnym razie możesz uzyskać unikalne konflikty kluczy. np. Éleanore i Eleanore mogą być uważane za takie same w niektórych zestawieniach.
Na bok:
Miałem sytuację, w której niektóre znaki „pękały” w wiadomościach e-mail, mimo że były przechowywane w bazie danych jako UTF-8. Jeśli wysyłasz wiadomości e-mail przy użyciu danych utf8, możesz również chcieć przekonwertować swoje wiadomości e-mail, aby wysyłać je w UTF8.
W PHPMailer, po prostu zaktualizuj ten wiersz:
public $CharSet = 'utf-8';
źródło
W przypadku baz danych, które mają dużą liczbę tabel, możesz użyć prostego skryptu php, aby zaktualizować zestaw znaków bazy danych i wszystkich tabel, używając:
źródło
źródło
źródło
Najbezpieczniejszym sposobem jest zmodyfikowanie kolumn najpierw do typu binarnego, a następnie zmodyfikowanie go z powrotem do tego typu za pomocą pożądanego zestawu znaków.
Każdy typ kolumny ma swój odpowiedni typ binarny, jak następuje:
Na przykład.:
Próbowałem na kilku stołach Latin1 i zachowałem wszystkie znaki diakrytyczne.
Możesz wyodrębnić to zapytanie dla wszystkich kolumn, które to robią:
Po wykonaniu tego we wszystkich kolumnach, to we wszystkich tabelach:
Aby wygenerować to zapytanie dla całej tabeli, użyj następującego zapytania:
A teraz, gdy zmodyfikowałeś wszystkie swoje kolumny i tabele, zrób to samo w bazie danych:
źródło
Jeśli nie możesz przekonwertować swoich tabel lub twój stół jest zawsze ustawiony na jakiś zestaw znaków inny niż utf8, ale chcesz utf8, najlepszym rozwiązaniem może być wymazanie go i rozpoczęcie od nowa i wyraźne określenie:
źródło
Jedyne rozwiązanie, które działało dla mnie: http://docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8
Konwertowanie bazy danych zawierającej tabele
źródło
alter table nazwa_tabeli charset = 'utf8';
Jest to proste zapytanie, którego mogłem użyć w moim przypadku, możesz zmienić nazwę tabeli zgodnie ze swoimi wymaganiami.
źródło
Aby zmienić kodowanie zestawu znaków na UTF-8 dla samej bazy danych, wpisz następujące polecenie w wierszu polecenia mysql>. Zamień DBNAME na nazwę bazy danych:
źródło
Możesz także użyć narzędzia DB Navicat, co czyni to łatwiejszym.
Kliknij prawym przyciskiem myszy swoją bazę danych i wybierz Właściwości DB i Zmień zgodnie z potrzebami w menu rozwijanym
źródło
Rozwiązanie wiersza polecenia i wyklucz widoki
Ja po prostu ukończenie @ Jasny za odpowiedź dla innych jak
@Brian
i ja, którzy mają poglądy w naszej bazie danych.Jeśli masz taki błąd:
To dlatego, że prawdopodobnie masz poglądy i musisz je wykluczyć. Ale podczas próby ich wykluczenia MySQL zwraca 2 kolumny zamiast 1.
Musimy więc dostosować polecenie Jasnego,
awk
aby wyodrębnić tylko pierwszą kolumnę, która zawiera nazwę tabeli.Jednowarstwowy do prostego kopiowania / wklejania
źródło
Aby zmienić kodowanie zestawu znaków na UTF-8, wykonaj proste kroki w PHPMyAdmin
Wybierz swoją bazę danych
Przejdź do operacji
źródło