Zmienić domyślny zestaw znaków MySQL na UTF-8 w my.cnf?


334

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ć?


19
Zauważ, że lepszym domyślnym byłoby utf8mb4, tj. Prawdziwy UTF-8 z pełną obsługą Unicode. Zobacz Jak obsługiwać pełny Unicode w bazach danych MySQL .
Mathias Bynens,

@Jorre, czy sprzeciwiłbyś się zmianie tego, że jest utf8mb4to miły sposób ustanawiający niebezpieczny precedens?
Evan Carroll

Odpowiedzi:


424

Aby ustawić wartość domyślną na UTF-8, chcesz dodać następujące do my.cnf

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

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ć.


18
Powyższe ustawienia my.cnf również działały dla mnie. Dodatkowo musiałem się upewnić, że tabela jest ustawiona poprawnie, na przykład ALTER TABLE TableCONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Chris Livdahl

8
Nie działa dla MySQL 5.5. Użyłem: <br/> [mysqld] # Zmiany dla utf-8 collation-server = utf8mb4_unicode_ci init-connect = 'SET NAMES utf8mb4' character-set-server = utf8mb4 i utf8mb4 gdzie indziej, jak wspomniano powyżej.
Czempion

12
Na Ubuntu 12.04 działało to dla mnie - jeśli usunę pierwszy wiersz później [mysqld].
Brandon Bertelsen,

4
Wygląda na to, że domyślny zestaw znaków nie jest już dozwolony w sekcji [mysqld]
marsbard 24.03.2013

4
Zauważ, że jeśli UTF-8 jest tym, czego chcesz, nie używaj utf8zestawu znaków MySQL . Użyj utf8mb4zamiast tego.
Mathias Bynens,

255

W najnowszej wersji MySQL

default-character-set = utf8

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ś:

  1. Usuń tę dyrektywę i powinieneś być dobry.

  2. Następnie plik konfiguracyjny (na przykład „/etc/my.cnf”) powinien wyglądać następująco:

    [mysqld]
    collation-server = utf8_unicode_ci
    init-connect='SET NAMES utf8'
    character-set-server = utf8
  3. Uruchom ponownie MySQL.

  4. Aby upewnić się, że MySQL to UTF-8, uruchom następujące zapytania w wierszu polecenia MySQL:

    • Pierwsze zapytanie:

       mysql> show variables like 'char%';

      Dane wyjściowe powinny wyglądać następująco:

       +--------------------------+---------------------------------+
       | Variable_name            | Value                           |
       +--------------------------+---------------------------------+
       | character_set_client     | utf8                            |
       | character_set_connection | utf8                            |
       | character_set_database   | utf8                            |
       | character_set_filesystem | binary                          |
       | character_set_results    | utf8                            |
       | character_set_server     | utf8                            |
       | character_set_system     | utf8                            |
       | character_sets_dir       | /usr/local/mysql/share/charsets/|
       +--------------------------+---------------------------------+
    • Drugie zapytanie:

       mysql> show variables like 'collation%';

      Dane wyjściowe zapytania to:

       +----------------------+-----------------+
       | Variable_name        | Value           |
       +----------------------+-----------------+
       | collation_connection | utf8_general_ci |
       | collation_database   | utf8_unicode_ci |
       | collation_server     | utf8_unicode_ci |
       +----------------------+-----------------+

Czy twój pierwszy wiersz max_allowed_packet = 64M jest związany z tym problemem UTF8?
malhal

Mam character_set_filesystem | utf8. Nie jestem pewien, czy to w porządku?
wujek Lem

1
Wypróbowałem MariaDB v5.5 i działa, dzięki! mysql Ver 15.1 Distrib 5.5.35-MariaDB, for debian-linux-gnu (x86_64) using readline 5.1
cenk

Myślę, że nie musisz go usuwać default-character-set, zamiast tego możesz zmienić na loose-default-character-set = utf8- to znaczy przedrostek z „loose”. To sprawia, że mysqlbinlogszczęśliwy, jeśli chcesz go używać - google: "loose-default-character-set" mysqlbinlog .
KajMagnus

Czy to init-connect='SET NAMES utf8'naprawdę konieczne? Jeśli nie, zdecydowanie możemy się bez niego obejść pod względem wydajności.
datasn.io

56

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

mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

Config

# 💩 𝌆
# UTF-8 should be used instead of Latin1. Obviously.
# NOTE "utf8" in MySQL is NOT full UTF-8: http://mathiasbynens.be/notes/mysql-utf8mb4

[client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

[mysql]
default-character-set = utf8mb4

Nowe ustawienia

mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

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):

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

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ć.


Śledziłem twoje ustawienia, ale uważam, że character_set_databasewciąż jest utf8i collation_databasejest utf8_bin`. Przegapiłem coś?
Stewart

Znaleziono to, za czym tęskniłem. Te 2 ustawienia są ustawiane podczas tworzenia samej bazy danych. Zobacz to pytanie; stackoverflow.com/questions/22572558/...
Stewart

1
dodaj character-set-client-handshake = FALSEdo sekcji [mysqld], dzięki czemu zawsze będzie używać domyślnego kodowania, nawet jeśli popełnisz błąd na warstwie aplikacji
Lukas Liesis,

cześć Próbowałem tego rozwiązania, ale nadal nie mogę wyświetlić character_set_client | utf8mb4. to utf8. tylko character_set_database utf8mb4 i character_set_server utf8mb4 to utf8mb4 inne niezmienione. Proszę o pomoc
Bhavin Chauhan,

@ baic6 Sugeruję dodanie uwagi wyjaśniającej, dlaczego przyczyną problemu mogą być tylko zaindeksowane kolumny. Ograniczenie do 767 bajtów dotyczy tylko kolumn indeksowanych, ponieważ ograniczenie dotyczy „kluczy”. Zasadniczo nie dotyczy to nieindeksowanych kolumn. Jeśli kolumna miała wartość o maksymalnej długości bajtów, powiedzmy 255 znaków i użyto maks. 3 bajtów utf8, nadal potrzebowałaby tylko 255 * 3 bajtów, utf8mb4 w tych przypadkach użyje tylko 3 bajtów, ponieważ te znaki w utf8mb4 również potrzeba tylko 3 bajtów. To znaczy, chyba że znak, który nie pasuje do utf8, nie został zapisany w kolumnie, w którym to przypadku informacje zostały już utracone.
Sam

55

Na MySQL 5.5 mam w my.cnf

[mysqld] 
init_connect='SET collation_connection = utf8_unicode_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8 
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

Wynik jest

mysql> show variables like "%character%";show variables like "%collation%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

2
Co skip-character-set-client-handshakedokładnie robi i pod jakimi warunkami jest to wymagane?
Simon East,

3
@ Simon, gdy używałem, show variables like "%collation%";widziałem 'collation_connection' as utf8_general_cioraz collation_database i collation_server as utf8_unicode_ci. Dodanie wiersza skip-character-set-client-handshakezmieniło ogólny wpis na Unicode, więc wszystkie trzy były spójne.
Vaughany

2
W MySQL 5.6 uzgadnianie z pominięciem zestawu znaków-klient nie robi tego, co powiedział @Vaughany. Jakieś sugestie?
Ababneh A

4
skip-character-set-client-handshakeZrobił to za mnie (wraz z „zestawu znaków serwera” i „sortowania-serwer”, oczywiście - na Debianie 7). Do init_connects nie zrobić różnicę z lub bez skipi wydaje się zbędny. +1 i dziękuję.
Jeff

3
Pomiń-zestaw-znaków-uzgadnianie klienta ignoruje informacje o zestawie znaków wysyłane przez klienta. Miło jest wymusić określony zestaw znaków podczas komunikacji, ale jeśli klient oczekuje czegoś innego, może to prowadzić do problemów. Powiedziałbym, że lepiej jest określić to na kliencie (swojej aplikacji).
0b10011

31

Uwaga: plik my.cnf znajduje się w/etc/mysql/

Po dodaniu tych wierszy:

[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
skip-character-set-client-handshake

[client]
default-character-set   = utf8

[mysql]
default-character-set   = utf8

Nie zapomnij zrestartować serwera:

sudo service mysql restart

2
Uwaga: Zmienia to wartości domyślne; to jednak nie zmienia kodowanie dla wszelkich istniejących kolumnach.
Rick James,

24

NijaCat był blisko, ale określono przesadę:

Aby ustawić wartość domyślną na UTF-8, chcesz dodać następujące do my.cnf

[client]
default-character-set=utf8

[mysqld]
default-character-set = utf8

Następnie, aby zweryfikować:

mysql> show variables like "%character%";show variables like "%collation%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

5
Niezła odpowiedź. Być może krótkie wyjaśnienie, które części są nadmierne, pomogłoby ludziom zdecydować, czego dokładnie chcą w swojej konfiguracji.
Mike Samuel,

@Derek, co [mysql] default-character-set=utf8wtedy robi?
Pacerier

1
Grupa opcji [klient] już ustawia opcje dla wszystkich klientów MySQL, które czytają plik my.cnf. Grupa [mysql] ustawia opcje tylko dla pliku binarnego klienta „mysql”. Jeśli chcesz ustawić opcję mysql, która nie dotyczy innych klientów, użycie tej grupy jest odpowiednie, ale ustawienie tej samej wartości opcji w obu lokalizacjach jest zbędne. dev.mysql.com/doc/refman/5.6/en/option-files.html
Derek

@ Mike Samuel, ustawienie domyślnego zestawu znaków na utf8 już implikuje domyślny tryb sortowania utf8_general_ci. Z drugiej strony „init-connect = 'SET NAMES utf8'” jest dość interesującym pomysłem, ponieważ próbuje zmusić wszystkich klientów łączących się z serwerem do korzystania z utf8, ale jest to stosowane niekonsekwentnie w zależności od uprawnień połączenia podejrzewamy, że niektórzy łączący się klienci zewnętrzni mogą być zdezorientowani, gdy serwer zastępuje żądany zestaw znaków. dev.mysql.com/doc/refman/5.6/en/charset-applications.html
Derek

Do [mysqld]użytku character-set-serverzamiastdefault-character-set
Rick James

23

Dowiedziałem się także, że po ustawieniu default-character-set = utf8w [mysqld]tytule MySQL 5.5.x nie uruchamia się pod Ubuntu 12.04 (Precise Pangolin).


16
To błąd MySQL # 52047 . Poniżej [mysqld]należy użyć character-set-serverzamiast default-character-set. (Zgadzam się, bardzo mylące!)
Mathias Bynens,

Tak. Przestarzałe w 5.0; usunięty w 5.5.
Rick James

22

MySQL v5.5.3 i nowszy:

Wystarczy dodać trzy wiersze tylko w sekcji [mysqld]:

[mysqld]
character-set-server = utf8
collation-server = utf8_unicode_ci
skip-character-set-client-handshake

Uwaga: W tym skip-character-set-client-handshakeoto eliminuje potrzebę uwzględnienia zarówno init-connectw [mysqld]i default-character-setw [client]i [mysql]sekcje.


1
Wow, tyle duplikatów odpowiedzi na to pytanie, a jednak wydaje się to najprostsze. Działa również dla mnie w wersji 5.5.44.
Justin Watt,

9

W Xubuntu 12.04 po prostu dodałem

[mysqld]
character_set_server = utf8

do /etc/mysql/my.cnf

I wynik jest taki

mysql> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

Zobacz także http://dev.mysql.com/doc/refman/5.6/en/charset-server.html


Potrzebujesz także [klienta] default-character-set = utf8, w przeciwnym razie, gdy użyjesz mysql w linii poleceń, nie użyje utf8 potencjalnie niszcząc wszelkie kopie zapasowe przesyłane potokiem do pliku.
malhal

9

Wszystkie wymienione tutaj ustawienia są prawidłowe, ale oto najbardziej optymalne i wystarczające rozwiązanie:

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
character-set-server = utf8
collation-server = utf8_unicode_ci

[client]
default-character-set = utf8

Dodaj je do /etc/mysql/my.cnf.

Uwaga: wybieram rodzaj sortowania utf8_unicode_ci ze względu na problem z wydajnością.

Wynik to:

mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

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 .:

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci | <---
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

użytkownik z uprawnieniami spoza SUPER :

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

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.


3
Chciałbym móc przeczytać Twój link, ale nie mogę czytać w języku rosyjskim, a tłumaczenie Google nie jest tak pomocne w przypadku tekstów technicznych. Z tego, co mogę powiedzieć, byłoby to bardzo interesujące. Czy możesz rozważyć opublikowanie wersji angielskiej?
Martijn Heemels

2
Czy możesz wyjaśnić, które ustawienie nie ustawia sortowania połączeń użytkownika SUPER? (i czy istnieje rozwiązanie)
KCD

@ gahcep, oświadczyłeś, że używasz z utf8_unicode_cipowodu problemów z wydajnością, więc dlaczego nie użyć utf8_binzamiast tego?
Pacerier

Cześć Paceriar. Słuszna uwaga. Teraz nie jestem pewien, czy mój wybór był właściwy utf8_unicode_ci. Nigdy nie spędzałem czasu na testowaniu wydajności.
gahcep


4

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] 
init_connect='SET collation_connection = utf8_unicode_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8 
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

[mysqld]

Spowoduje to zmianę collation_connection na utf8_unicode_ci

init_connect='SET collation_connection = utf8_unicode_ci'

Używanie SET NAMES:

init_connect='SET NAMES utf8'

SET NAMES wpłynie na trzy postacie, to znaczy:

character_set_client
character_set_results
character_set_connection

To się ustawi character_set_database & character_set_server

character-set-server=utf8

Wpłynie to tylko na collation_database & collation_server

collation-server=utf8_unicode_ci

Przepraszam, nie jestem pewien, po co to jest. Nie używam go jednak:

skip-character-set-client-handshake

W dokumentacji zauważa, że character_set_servernie powinno być ustawiane ręcznie.
Brian

Jakie jest zatem najnowocześniejsze podejście? Możemy jednoznacznie przekazać tę informację character setpodczas nawiązywania połączenia z bazą danych, jednak wygląda to trochę denerwująco.
Lihang Li,

Właściwie popełniłem błąd. Dokumentacja mówi, że character_set_database nie powinien być ustawiany dynamicznie. Nie wspomina o serwerze_znaków_znaków. Nie jestem jednak pewien, czy musisz się martwić o serwer_znaków_znaków, ponieważ myślę, że wpływa to tylko na wartość domyślną dla nowo utworzonej bazy danych?
Brian

Jak wspomniałem powyżej i powtórzyłem eksperyment dopiero teraz, character_set_serverw [mysqld]sekcji będzie miało wpływ character_set_databasei character_set_server. Teraz uważam, że dobrą praktyką jest wyraźne wskazanie character set, czego chcesz użyć podczas tworzenia bazy danych, tabeli i połączenia z bazą danych. Szczerze mówiąc, dokumentacja mysqlnie jest tak łatwa do zrozumienia. Czy wiesz, czy istnieje ogólny sposób na wykonanie wszystkich ustawień character seti collationustawień w mysql?
Lihang Li,

4

W Fedorze 21

$ vi /etc/my.cnf

Dodaj następujące:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

Zapisz i wyjdź.

Na koniec pamiętaj o ponownym uruchomieniu usługi mysqld za pomocą service mysqld restart.


1

MySQL 5.5, wszystko czego potrzebujesz to:

[mysqld]
character_set_client=utf8
character_set_server=utf8
collation_server=utf8_unicode_ci

collation_server jest opcjonalne.

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

1

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”


1

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):

  1. vi /etc/my.cnf
  2. dodaj zawartość cios i :wq [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
  3. zrestartuj mysql i zaloguj mysql, użyj bazy danych, wprowadź polecenie status; , znajdziesz zestaw znaków dla „klienta”, a „conn” jest ustawiony na „utf8”.

Sprawdź referencję, aby uzyskać więcej informacji.


0

Możesz to zrobić tak, jak to działa, a jeśli to nie działa, musisz ponownie uruchomić mysql.


-1

Zmień znak MySQL:

Klient

default-character-set=utf8

mysqld

character_set_server=utf8

Nie powinniśmy pisać default-character-set=utf8w mysqld, ponieważ może to spowodować błąd:

start: zadanie nie uruchomiło się

W końcu:

 +--------------------------+----------------------------+
 | Variable_name            | Value                      |
 +--------------------------+----------------------------+
 | character_set_client     | utf8                       |
 | character_set_connection | utf8                       |
 | character_set_database   | utf8                       |
 | character_set_filesystem | binary                     |
 | character_set_results    | utf8                       |
 | character_set_server     | utf8                       |
 | character_set_system     | utf8                       |
 | character_sets_dir       | /usr/share/mysql/charsets/ |
 +--------------------------+----------------------------+
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.