Obecnie używamy następujących poleceń w PHP, aby ustawić zestaw znaków na UTF-8 w naszej aplikacji.
Ponieważ jest to trochę narzutu, chcielibyśmy ustawić to jako ustawienie domyślne w MySQL. Czy możemy to zrobić w /etc/my.cnf lub w innym miejscu?
SET NAMES 'utf8'
SET CHARACTER SET utf8
Szukałem domyślnego zestawu znaków w /etc/my.cnf, ale nie ma nic w zestawach znaków.
W tym momencie wykonałem następujące czynności, aby ustawić zestaw znaków i zestawienie MySQL na UTF-8:
skip-character-set-client-handshake
character_set_client=utf8
character_set_server=utf8
Czy to właściwy sposób, aby sobie z tym poradzić?
mysql
character-encoding
Jorre
źródło
źródło
utf8mb4
, tj. Prawdziwy UTF-8 z pełną obsługą Unicode. Zobacz Jak obsługiwać pełny Unicode w bazach danych MySQL .utf8mb4
to miły sposób ustanawiający niebezpieczny precedens?Odpowiedzi:
Aby ustawić wartość domyślną na UTF-8, chcesz dodać następujące do my.cnf
Jeśli chcesz zmienić zestaw znaków dla istniejącej bazy danych, daj mi znać ... twoje pytanie nie określiło go bezpośrednio, więc nie jestem pewien, czy to właśnie chcesz zrobić.
źródło
Table
CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;[mysqld]
.utf8
zestawu znaków MySQL . Użyjutf8mb4
zamiast tego.W najnowszej wersji MySQL
powoduje problem. Myślę, że jest przestarzałe.
Jak mówi Justin Ball w „ Aktualizacja do MySQL 5.5.12, a teraz MySQL nie chce się uruchomić , powinieneś:
Usuń tę dyrektywę i powinieneś być dobry.
Następnie plik konfiguracyjny (na przykład „/etc/my.cnf”) powinien wyglądać następująco:
Uruchom ponownie MySQL.
Aby upewnić się, że MySQL to UTF-8, uruchom następujące zapytania w wierszu polecenia MySQL:
Pierwsze zapytanie:
Dane wyjściowe powinny wyglądać następująco:
Drugie zapytanie:
Dane wyjściowe zapytania to:
źródło
character_set_filesystem | utf8
. Nie jestem pewien, czy to w porządku?mysql Ver 15.1 Distrib 5.5.35-MariaDB, for debian-linux-gnu (x86_64) using readline 5.1
default-character-set
, zamiast tego możesz zmienić naloose-default-character-set = utf8
- to znaczy przedrostek z „loose”. To sprawia, żemysqlbinlog
szczęśliwy, jeśli chcesz go używać - google: "loose-default-character-set" mysqlbinlog .init-connect='SET NAMES utf8'
naprawdę konieczne? Jeśli nie, zdecydowanie możemy się bez niego obejść pod względem wydajności.To pytanie ma już wiele odpowiedzi, ale Mathias Bynens wspomniał, że zamiast utf8 należy użyć „utf8mb4”, aby uzyskać lepszą obsługę UTF-8 („utf8” nie obsługuje 4-bajtowych znaków, pola są obcinane przy wstawianiu ). Uważam to za ważną różnicę. Oto kolejna odpowiedź na temat ustawiania domyślnego zestawu znaków i sortowania. Taki, który pozwoli Ci wstawić kupkę kupki (💩).
Działa to na MySQL 5.5.35.
Pamiętaj, że niektóre ustawienia mogą być opcjonalne. Ponieważ nie jestem do końca pewien, że niczego nie zapomniałem, zrobię z tej odpowiedzi wiki społeczności.
Stare ustawienia
Config
Nowe ustawienia
character_set_system to zawsze utf8 .
Nie wpłynie to na istniejące tabele, jest to tylko ustawienie domyślne (używane w nowych tabelach). Do konwersji istniejącej tabeli można użyć następującego kodu ALTER (bez obejścia przywracania zrzutu):
Edytować:
Na serwerze MySQL 5.0: character_set_client, character_set_connection, character_set_results, collation_connection pozostają na latin1. Wystawianie
SET NAMES utf8
(utf8mb4 niedostępne w tej wersji) ustawia je również na utf8.Uwaga : Jeśli masz tabelę utf8 z kolumną indeksu typu VARCHAR (255), w niektórych przypadkach nie można jej przekonwertować, ponieważ maksymalna długość klucza została przekroczona (
Specified key was too long; max key length is 767 bytes.
). Jeśli to możliwe, zmniejsz rozmiar kolumny z 255 do 191 (ponieważ 191 * 4 = 764 <767 <192 * 4 = 768). Następnie tabelę można przekonwertować.źródło
character_set_database
wciąż jestutf8
icollation_database
jest utf8_bin`. Przegapiłem coś?character-set-client-handshake = FALSE
do sekcji [mysqld], dzięki czemu zawsze będzie używać domyślnego kodowania, nawet jeśli popełnisz błąd na warstwie aplikacjiNa MySQL 5.5 mam w my.cnf
Wynik jest
źródło
skip-character-set-client-handshake
dokładnie robi i pod jakimi warunkami jest to wymagane?show variables like "%collation%";
widziałem 'collation_connection' asutf8_general_ci
oraz collation_database i collation_server asutf8_unicode_ci
. Dodanie wierszaskip-character-set-client-handshake
zmieniło ogólny wpis na Unicode, więc wszystkie trzy były spójne.skip-character-set-client-handshake
Zrobił to za mnie (wraz z „zestawu znaków serwera” i „sortowania-serwer”, oczywiście - na Debianie 7). Doinit_connect
s nie zrobić różnicę z lub bezskip
i wydaje się zbędny. +1 i dziękuję.Uwaga: plik my.cnf znajduje się w
/etc/mysql/
Po dodaniu tych wierszy:
Nie zapomnij zrestartować serwera:
źródło
NijaCat był blisko, ale określono przesadę:
Aby ustawić wartość domyślną na UTF-8, chcesz dodać następujące do my.cnf
Następnie, aby zweryfikować:
źródło
[mysql] default-character-set=utf8
wtedy robi?[mysqld]
użytkucharacter-set-server
zamiastdefault-character-set
Dowiedziałem się także, że po ustawieniu
default-character-set = utf8
w[mysqld]
tytule MySQL 5.5.x nie uruchamia się pod Ubuntu 12.04 (Precise Pangolin).źródło
[mysqld]
należy użyćcharacter-set-server
zamiastdefault-character-set
. (Zgadzam się, bardzo mylące!)MySQL v5.5.3 i nowszy:
Wystarczy dodać trzy wiersze tylko w sekcji [mysqld]:
Uwaga: W tym
skip-character-set-client-handshake
oto eliminuje potrzebę uwzględnienia zarównoinit-connect
w[mysqld]
idefault-character-set
w[client]
i[mysql]
sekcje.źródło
W Xubuntu 12.04 po prostu dodałem
do /etc/mysql/my.cnf
I wynik jest taki
Zobacz także http://dev.mysql.com/doc/refman/5.6/en/charset-server.html
źródło
Wszystkie wymienione tutaj ustawienia są prawidłowe, ale oto najbardziej optymalne i wystarczające rozwiązanie:
Dodaj je do
/etc/mysql/my.cnf
.Uwaga: wybieram rodzaj sortowania utf8_unicode_ci ze względu na problem z wydajnością.
Wynik to:
I wtedy łączysz się jako użytkownik inny niż SUPER !
Na przykład różnica między połączeniem jako użytkownik SUPER i użytkownik inny niż SUPER (oczywiście w przypadku sortowania utf8_unicode_ci ):
użytkownik z SUPER priv .:
użytkownik z uprawnieniami spoza SUPER :
Napisałem obszerny artykuł (Rus) szczegółowo wyjaśniający, dlaczego powinieneś skorzystać z jednej lub drugiej opcji. Uwzględniane są wszystkie typy zestawów znaków i zestawień : dla serwera, bazy danych, połączenia, tabeli, a nawet kolumny.
Mam nadzieję, że ten artykuł pomoże wyjaśnić niejasne momenty.
źródło
utf8_unicode_ci
powodu problemów z wydajnością, więc dlaczego nie użyćutf8_bin
zamiast tego?utf8_unicode_ci
. Nigdy nie spędzałem czasu na testowaniu wydajności.Dyrektywa zmieniła się na
character-set-system=utf8
http://dev.mysql.com/doc/refman/5.6/en/charset-configuration.html
źródło
Wersje MySQL i dystrybucje Linuksa mogą mieć znaczenie przy tworzeniu konfiguracji.
Zalecane są jednak zmiany w
[mysqld]
sekcji.Chcę krótko wyjaśnić odpowiedź tomazzlendera:
[mysqld]
Spowoduje to zmianę collation_connection na utf8_unicode_ci
Używanie
SET NAMES
:SET NAMES wpłynie na trzy postacie, to znaczy:
To się ustawi
character_set_database & character_set_server
Wpłynie to tylko na collation_database & collation_server
Przepraszam, nie jestem pewien, po co to jest. Nie używam go jednak:
źródło
character_set_server
nie powinno być ustawiane ręcznie.character set
podczas nawiązywania połączenia z bazą danych, jednak wygląda to trochę denerwująco.character_set_server
w[mysqld]
sekcji będzie miało wpływcharacter_set_database
icharacter_set_server
. Teraz uważam, że dobrą praktyką jest wyraźne wskazaniecharacter set
, czego chcesz użyć podczas tworzenia bazy danych, tabeli i połączenia z bazą danych. Szczerze mówiąc, dokumentacjamysql
nie jest tak łatwa do zrozumienia. Czy wiesz, czy istnieje ogólny sposób na wykonanie wszystkich ustawieńcharacter set
icollation
ustawień w mysql?W Fedorze 21
Dodaj następujące:
Zapisz i wyjdź.
Na koniec pamiętaj o ponownym uruchomieniu usługi mysqld za pomocą
service mysqld restart
.źródło
MySQL 5.5, wszystko czego potrzebujesz to:
collation_server
jest opcjonalne.źródło
Jeśli masz problemy z potwierdzeniem obsługi zestawu znaków klienta za pomocą MySQL Workbench, pamiętaj o następujących uwagach:
Ważne Wszystkie połączenia otwierane przez MySQL Workbench automatycznie ustawiają zestaw znaków klienta na utf8. Ręczna zmiana zestawu znaków klienta, na przykład za pomocą SET NAMES ..., może spowodować nieprawidłowe wyświetlanie znaków w MySQL Workbench. Aby uzyskać dodatkowe informacje na temat zestawów znaków klienta, zobacz Zestawy znaków i zestawienia połączeń.
Dlatego nie byłem w stanie zastąpić zestawów znaków MySQL Workbench zmianami my.cnf. np. „set names utf8mb4”
źródło
Jeśli jesteś zdezorientowany ustawieniami klienta, a połączenie zostanie zresetowane po ponownym uruchomieniu usługi mysql. Spróbuj wykonać następujące kroki (które działały dla mnie):
vi /etc/my.cnf
:wq [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
status;
, znajdziesz zestaw znaków dla „klienta”, a „conn” jest ustawiony na „utf8”.Sprawdź referencję, aby uzyskać więcej informacji.
źródło
Możesz to zrobić tak, jak to działa, a jeśli to nie działa, musisz ponownie uruchomić mysql.
źródło
Zmień znak MySQL:
Klient
mysqld
Nie powinniśmy pisać
default-character-set=utf8
w mysqld, ponieważ może to spowodować błąd:W końcu:
źródło