Đặt giá trị của character_set_client thành utf8mb4


12

Tôi đang cố gắng chuyển đổi DB của mình để làm utf8mb4theo hướng dẫn này . Tôi đã đặt:

[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

Nhưng giá trị của character_set_clientcharacter_set_resultsvẫn sẽ không thay đổi thành 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 |
+--------------------------+--------------------+

Tôi đang làm gì sai? Làm cách nào để đặt các giá trị đó thành utf8mb4?

Câu trả lời:


14

Tiết lộ: Tôi là tác giả của Cách hỗ trợ Unicode đầy đủ trong cơ sở dữ liệu MySQL , hướng dẫn bạn đang theo dõi.

  1. Bạn đã lưu các thiết lập sửa đổi ở đâu? Kiểm tra nơi mysqldtải các tùy chọn mặc định từ. Nó thường /etc/my.cnf( như được đề cập trong hướng dẫn ) nhưng nó có thể khác trên hệ thống của bạn. Chạy lệnh sau để tìm hiểu:

    $ 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. Bạn đã khởi động lại mysqldbằng cách chạy mysqld restartsau khi thực hiện các thay đổi?


1. Tôi đã lưu các thay đổi trong \xampp\mysql\bin\my.ini. Tôi không thể chạy mysqld --help --verbose 2> /dev/null | grep -A1 'Default options'- vì nó đưa ra lỗi sau: 'grep' is not recognized as an internal or external command, operable program or batch file.Tôi chưa quen với công cụ này, vì vậy tôi có thể đang làm gì đó sai.
qwaz

2. Tôi đã khởi động lại mysqld và sau khi nó đưa ra các cảnh báo sau: 2014/02/19 10:25:17 0 [Cảnh báo] Sử dụng tiền tố tùy chọn duy nhất character_set_client thay vì bắt tay-set-client-client bị loại bỏ và sẽ bị xóa trong một bản phát hành trong tương lai. Vui lòng sử dụng tên đầy đủ để thay thế. 2014/02/19 10:25:17 0 [Cảnh báo] mysqld: bỏ qua tùy chọn '--character-set-client-handshake' do giá trị không hợp lệ 'utf8mb4'
qwaz

1
Tại sao bạn có skip-character-set-client-handshaketrong tập tin cấu hình của bạn? Đây là một tùy chọn dòng lệnh, không phải là một biến.
Mathias Bynens

1
Tôi đã phải cài đặt lại máy chủ cục bộ; đi qua hướng dẫn của bạn một lần nữa và mọi thứ làm việc ra. Tôi đánh giá cao phản ứng và giúp đỡ của bạn. Tôi sẽ trở lại câu trả lời của bạn và nâng cấp nó ngay khi tôi có đủ đại diện để làm như vậy.
qwaz

3
Tôi cố gắng này, nhưng vẫn còn character_set_client, character_set_connection, character_set_results, collation_connectionđược hiển thị như utf8. Bất cứ ý tưởng tại sao điều này không làm việc?
Sarita

2

Tôi cũng đã làm theo hướng dẫn đó, tuy nhiên, vấn đề tương tự lại xuất hiện. Vấn đề thực tế nằm ở lệnh được sử dụng để tạo DB vì nó DEFAULT CHARACTERlà một đối số và nếu điều đó không được thông qua trong khi thực thi thì một bộ ký tự mặc định được truyền đi utfmb4.

Dưới đây là các bước mà tôi đã làm theo để khắc phục nó:

  1. Tạo một cơ sở dữ liệu giả với utf8mb4bộ ký tự.

    create database `your_db_name_dummy`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
  2. Sao chép cấu trúc và dữ liệu thực tế vào cơ sở dữ liệu giả này từ cơ sở dữ liệu thực tế

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

  3. Bỏ cơ sở dữ liệu hiện tại

    SET FOREIGN_KEY_CHECKS=0;
    DROP DATABASE your_db_name;
  4. Tạo cơ sở dữ liệu mới

    create database `your_db_name`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
  5. Cuối cùng, đưa cấu trúc bảng và dữ liệu trở lại cơ sở dữ liệu ban đầu

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

Nếu bạn sẽ sử dụng quy trình được đề cập ở trên thì hãy đảm bảo đọc kỹ các dòng được đề cập bên dưới.

Điều kiện tiên quyết và hiện trạng của tôi:

  • Sao lưu tất cả cấu trúc, dữ liệu, thủ tục lưu trữ, chức năng, kích hoạt, v.v.
  • mysql --version mysql Ver 14,14 Phân phối 5.7,22, cho Linux (x86_64) bằng cách sử dụng trình bao bọc 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
  • Tôi đang sử dụng máy khách java 'mysql:mysql-connector-java:5.1.30'

  • Chuỗi kết nối của tôi là jdbc:mysql://ip.of.database:3306/your_db_name?zeroDateTimeBehavior=convertToNull&noAccessToProcedureBodies=true&autoReconnect=true
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.