Ustaw wartość character_set_client na utf8mb4

12

Próbuję przekonwertować moją bazę danych utf8mb4zgodnie z tym przewodnikiem . Mam ustalone:

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
init-connect='SET NAMES utf8mb4'
collation_server=utf8mb4_unicode_ci
character_set_server=utf8mb4
skip-character-set-client-handshake

Ale wartość character_set_clienti character_set_resultsnadal nie zmieni się na utf8mb4.

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8               |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8               |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

Co ja robię źle? Jak ustawić te wartości na utf8mb4?

qwaz
źródło

Odpowiedzi:

14

Ujawnienie: Jestem autorem Jak w pełni obsługiwać Unicode w bazach danych MySQL , którego przestrzegasz.

  1. Gdzie zapisałeś zmodyfikowane ustawienia? Sprawdź, gdzie mysqldładuje domyślne opcje. Zwykle jest /etc/my.cnf( jak wspomniano w przewodniku ), ale może być inny w twoim systemie. Uruchom następujące polecenie, aby się dowiedzieć:

    $ mysqld --help --verbose 2> /dev/null | grep -A1 'Default options'
    Default options are read from the following files in the given order:
    /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
    
  2. Czy uruchomić ponownie mysqlduruchamiając mysqld restartpo wprowadzeniu zmian?

Mathias Bynens
źródło
1. Zapisałem zmiany w \xampp\mysql\bin\my.ini. Nie mogłem uruchomić mysqld --help --verbose 2> /dev/null | grep -A1 'Default options'- ponieważ daje następujący błąd: 'grep' is not recognized as an internal or external command, operable program or batch file.jestem nowy w tych sprawach, więc mogę robić coś złego.
qwaz
2. Zrestartowałem mysqld, a po tym daje mi następujące ostrzeżenia: 2014-02-19 10:25:17 0 [Ostrzeżenie] Używanie unikalnego przedrostka opcji character_set_client zamiast zestawu znaków-hand-handshake jest przestarzałe i zostanie usunięte w przyszłej wersji. Zamiast tego użyj pełnej nazwy. 2014-02-19 10:25:17 0 [Ostrzeżenie] mysqld: ignorowanie opcji „--character-set-client-handshake” z powodu niepoprawnej wartości „utf8mb4”
qwaz
1
Dlaczego masz skip-character-set-client-handshakew swoim pliku konfiguracyjnym? Jest to opcja wiersza polecenia, a nie zmienna.
Mathias Bynens,
1
Musiałem ponownie zainstalować lokalny serwer; ponownie przejrzałem przewodnik i wszystko się udało. Doceniam twoją odpowiedź i pomoc. Wrócę do twojej odpowiedzi i głosuję, jak tylko będę mieć wystarczającą liczbę powtórzeń, aby to zrobić.
qwaz
3
Próbowałem tego, ale nadal character_set_client, character_set_connection, character_set_results, collation_connectionjest pokazany jako utf8. Wszelkie pomysły, dlaczego to nie działa?
Sarita,
2

Postępowałem również zgodnie z tym przewodnikiem, jednak ten sam problem pojawił się ponownie. Rzeczywisty problem leży w poleceniu użytym do utworzenia bazy danych jako DEFAULT CHARACTERargumentu, a jeśli nie zostanie on przekazany podczas wykonywania, zostanie przekazany domyślny zestaw znaków, który nie zostanie przekazany utfmb4.

Poniżej znajdują się kroki, które wykonałem, aby to naprawić:

  1. Utwórz obojętną bazę danych z utf8mb4zestawem znaków.

    create database `your_db_name_dummy`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
  2. Skopiuj aktualną strukturę i dane do tej sztucznej bazy danych z rzeczywistej bazy danych

    mysqldump -uroot -proot_password your_db_name | mysql -uroot -proot_password your_db_name_dummy

  3. Upuść bieżącą bazę danych

    SET FOREIGN_KEY_CHECKS=0;
    DROP DATABASE your_db_name;
  4. Utwórz nową bazę danych

    create database `your_db_name`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
  5. Na koniec umieść strukturę tabeli i dane z powrotem w oryginalnej bazie danych

    mysqldump -uroot -proot_password your_db_name_dummy | mysql -uroot -proot_password your_db_name

Jeśli zamierzasz skorzystać z wyżej wymienionej procedury, pamiętaj również o uważnym przeczytaniu poniższych linii.

Wymagania wstępne i mój status quo:

  • Wykonaj kopię zapasową całej struktury, danych, procedur przechowywanych, funkcji, wyzwalaczy itp.
  • mysql --version mysql Ver 14.14 Distrib 5.7.22, dla Linux (x86_64) przy użyciu opakowania EditLine

  • cat /etc/my.cnf

    [client]
    default-character-set = utf8mb4
    
    [mysql]
    default-character-set = utf8mb4
    
    [mysqld]
    character-set-client-handshake = FALSE
    character-set-server = utf8mb4
    init-connect = 'SET NAMES utf8mb4
    collation-server = utf8mb4_unicode_ci
  • Używam klienta Java, który jest 'mysql:mysql-connector-java:5.1.30'

  • Mój ciąg połączenia to jdbc:mysql://ip.of.database:3306/your_db_name?zeroDateTimeBehavior=convertToNull&noAccessToProcedureBodies=true&autoReconnect=true
Obi Wan - PallavJha
źródło