Jedna z odpowiedzi na pytanie, które zadałem wczoraj, sugerowała, że powinienem upewnić się, że moja baza danych poprawnie obsługuje znaki UTF-8. Jak mogę to zrobić z MySQL?
102
Jedna z odpowiedzi na pytanie, które zadałem wczoraj, sugerowała, że powinienem upewnić się, że moja baza danych poprawnie obsługuje znaki UTF-8. Jak mogę to zrobić z MySQL?
CHARACTER SETs
; 5.1.24 zepsuło zestawienie niemieckich ostrych-s (ß), które zostało skorygowane przez dodanie innego zestawienia w 5.1.62 (prawdopodobnie pogorszyło sytuację); 5.5.3 wypełnił utf8 nowym zestawem znaków utf8mb4.utf8
. Obsługuje tylko znaki o długości do 3 bajtów. Prawidłowy zestaw znaków, którego powinieneś używać w MySQL, toutf8mb4
.Odpowiedzi:
Aktualizacja:
Krótka odpowiedź - Prawie zawsze powinieneś używać
utf8mb4
zestawu znaków iutf8mb4_unicode_ci
sortowania.Aby zmienić bazę danych:
Widzieć:
Komentarz Aarona do tej odpowiedzi. Jak sprawić, by MySQL poprawnie obsługiwał UTF-8
Jaka jest różnica między utf8_general_ci i utf8_unicode_ci
Przewodnik po konwersji: https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-conversion.html
Oryginalna odpowiedź:
MySQL 4.1 i nowsze wersje mają domyślny zestaw znaków UTF-8. Możesz to sprawdzić w swoim
my.cnf
pliku, pamiętaj, aby ustawić zarówno klienta, jak i serwer (default-character-set
icharacter-set-server
).Jeśli masz istniejące dane, które chcesz przekonwertować na UTF-8, zrzuć bazę danych i zaimportuj ją z powrotem jako UTF-8, upewniając się, że:
SET NAMES utf8
przed zapytaniem / wstawieniem do bazy danychDEFAULT CHARSET=utf8
podczas tworzenia nowych tabelmy.cnf
). pamiętaj, że wszystkie używane języki (takie jak PHP) również muszą być w formacie UTF-8. Niektóre wersje PHP będą używać własnej biblioteki klienta MySQL, która może nie obsługiwać UTF-8.Jeśli chcesz przenieść istniejące dane, pamiętaj, aby najpierw wykonać kopię zapasową! Wiele dziwnych fragmentów danych może się zdarzyć, gdy sprawy nie idą zgodnie z planem!
Niektóre zasoby:
źródło
utf8
w MySQL odnosi się tylko do niewielkiego podzbioru pełnego Unicode. Zamiast tego należy użyć,utf8mb4
aby wymusić pełne wsparcie. Zobacz mathiasbynens.be/notes/mysql-utf8mb4 "Przez długi czas używałem zestawu znaków utf8 MySQL dla baz danych, tabel i kolumn, zakładając , że jest on odwzorowany na kodowanie UTF-8 opisane powyżej."latin1
ilatin1_swedish_ci
dla domyślnego zestawu znaków i sortowania. Patrz „Serwer zestaw znaków i sortowaniem” stronę w podręczniku MySQL dla potwierdzenia: dev.mysql.com/doc/refman/5.1/en/charset-server.htmlutf8mb4
dodatkowe miejsce, gdy większość tekstu to ASCII. Chociażchar
łańcuchy są wstępnie przydzielone,varchar
łańcuchy nie są - zobacz kilka ostatnich wierszy na tej stronie dokumentacji . Na przykład,char(10)
będzie pesymistycznie zarezerwował 40 bajtów pod utf8mb4, alevarchar(10)
przydzieli bajty zgodnie z kodowaniem o zmiennej długości.varchar(n)
dotext
typu danych, jeśli próbować zmieniać sięvarchar(n)
pole do większej niż możliwym rozmiarze bajtów (wydając ostrzeżenie). Indeks będzie miał również dolną górną granicę najgorszego przypadku, co może powodować inne problemy.Aby to było „trwałe”, w
my.cnf
:Aby to sprawdzić, przejdź do klienta i pokaż kilka zmiennych:
Sprawdź, czy są one wszystkie
utf8
, z wyjątkiem tego..._filesystem
, co powinno byćbinary
i..._dir
, co wskazuje gdzieś w instalacji MySQL.źródło
create table my_name(field_name varchar(25) character set utf8);
utf8
nie jest „pełnym” UTF-8.MySQL 4.1 i nowsze wersje mają domyślny zestaw znaków, który wywołuje,
utf8
ale który w rzeczywistości jest tylko podzbiorem UTF-8 (dopuszcza tylko znaki trzy-bajtowe i mniejsze).Użyj
utf8mb4
jako swojego zestawu znaków, jeśli chcesz mieć „pełny” UTF-8.źródło
utf8
nie zawiera znaków, takich jak emotikony.utf8mb4
robi. Sprawdź to, aby uzyskać więcej informacji na temat aktualizacji: mathiasbynens.be/notes/mysql-utf8mb4Krótka odpowiedź: używaj
utf8mb4
w 4 miejscach:SET NAMES utf8mb4
lub coś równoważnego podczas nawiązywania połączenia klienta z MySQLCHARACTER SET utf8mb4
we wszystkich tabelach / kolumnach - z wyjątkiem kolumn, które są ściśle ascii / hex / country_code / zip_code / etc.<meta charset charset=UTF-8>
jeśli drukujesz do HTML. (Tak, pisownia jest inna).Więcej informacji ;
UTF8 w całości
Powyższe linki zapewniają „szczegółową odpowiedź kanoniczną jest wymagana, aby odpowiedzieć na wszystkie wątpliwości”. - Na tym forum obowiązuje limit miejsca.
Edytować
Oprócz tego, że
CHARACTER SET utf8mb4
zawiera „wszystkie” znaki świata,COLLATION utf8mb4_unicode_520_ci
jest to prawdopodobnie „najlepsze wszechstronne” zestawienie do użycia. (Istnieją również zestawienia języka tureckiego, hiszpańskiego itp. Dla tych, którzy chcą niuansów w tych językach).źródło
Zestaw znaków jest właściwością bazy danych (domyślnie) i tabeli. Możesz rzucić okiem (polecenia MySQL):
Innymi słowy; całkiem łatwo jest sprawdzić kodowanie bazy danych lub go zmienić:
źródło
utf8
nie jest „pełnym” UTF-8.Aby zmienić kodowanie zestawu znaków na UTF-8 dla samej bazy danych, wpisz następujące polecenie w wierszu polecenia mysql>. UŻYJ
ALTER DATABASE
.. Zastąp DBNAME nazwą bazy danych:To jest duplikat tego pytania. Jak przekonwertować cały zestaw znaków bazy danych MySQL i sortowanie do UTF-8?
źródło
Postępowałem zgodnie z rozwiązaniem Javiera, ale dodałem kilka różnych wierszy w my.cnf:
Znalazłem ten pomysł tutaj: http://dev.mysql.com/doc/refman/5.0/en/charset-server.html w pierwszym / jedynym komentarzu użytkownika na dole strony. Wspomina, że uścisk dłoni z pominięciem zestawu znaków i klienta ma pewne znaczenie.
źródło
skip-character-set-client-handshake
był klucz.Te wskazówki dotyczące MySQL i UTF-8 mogą być pomocne. Niestety nie stanowią one pełnego rozwiązania, a jedynie typowe pułapki.
źródło
Określ
database collation
, abyUTF-8
następnie zastosowaćtable collation
do domyślnej bazy danych.źródło
Twoja odpowiedź brzmi: możesz skonfigurować ustawienia MySql. W My Answer może być coś wyrwanego z kontekstu, ale to również jest pomoc dla ciebie.
jak skonfigurować
Character Set
iCollation
.utf8
, podczas gdy aplikacje korzystające z innej bazy danych mogą wymagać sjis.Przykłady pokazane tutaj dla twojego pytania, aby ustawić zestaw znaków utf8, tutaj również ustaw sortowanie dla bardziej pomocnego (
utf8_general_ci
collation`).Określ ustawienia znaków dla każdej bazy danych
Określ ustawienia znaków podczas uruchamiania serwera
Określ ustawienia znaków w czasie konfiguracji MySQL
Aby zobaczyć wartości zestawu znaków i zmiennych systemowych sortowania, które mają zastosowanie do Twojego połączenia, użyj następujących instrukcji:
To może być długa odpowiedź, ale jest cała droga, której możesz użyć. Mam nadzieję, że moja odpowiedź jest dla ciebie pomocna. aby uzyskać więcej informacji http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
źródło
SET NAMES UTF8
To załatwia sprawę
źródło
SET NAMES UTF8
(lubUTF8mb4
) jest poprawne, nie wyjaśniasz, co robi (zestaw znaków używany do tego połączenia). „To załatwia sprawę” brzmi tak, jakby rozwiązało problem (sprawi, że MySQL poprawnie obsłuży UTF-8), ale wiele baz danych MySQL jest domyślnie ustawionych na latin1, więc nie byłoby to właściwe rozwiązanie. Chciałbym zmienić domyślny zestaw znaków i kodowania znaków, stół do utf8mb4. Naprawdę, ta odpowiedź jest raczej niekompletna, więc ją odrzuciłem.PODŁĄCZENIE BAZY DANYCH DO UTF-8
źródło
Ustaw połączenie bazy danych na UTF8:
źródło
mysql_*
interfejsu. Przełącz namysqli_*
lubPDO
.Udało mi się znaleźć rozwiązanie. Uruchomiono następujące, jak określono na http://technoguider.com/2015/05/utf8-set-up-in-mysql/
źródło
CHARACTER SET utf8
.root
nie wykona najważniejszegoinit_connect
.