Służyłem aplikację Django z MySQL Back-End z Apache 2. Skonfigurowałem bazę danych z zestawem znaków ustawiony na "UTF8" Chcę przechowywać Emojis, więc muszę zmienić kodowanie do "UTF8MB4" po prostu chcę wiem, czy zmieniam konfigurację, czy wpłynie na moje dane? To jest mój plik MySQL.CNF

[client]
database = 'databasename'
user = 'username'
password = 'password'
default-character-set = utf8

To jest moje ustawienia Django dla bazy danych MySQL

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': '/path/to/mysql.cnf'
        }
    }
}

Jaki wpływ miał na moich wcześniej zapisanych danych? Także, jak mam to zrobić Czy powinienem prosto do przodu dodać do mojego domyślnego pliku konfiguracyjnego.

0
Saksham 17 styczeń 2020, 17:12

1 odpowiedź

Najlepsza odpowiedź

django:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        ...
        'OPTIONS': {
                    'charset': 'utf8mb4',
                    'use_unicode': True, },
    },
}

my.cnf:

[mysqld]
character-set-server=utf8mb4
default-collation=utf8mb4_unicode_520_ci

[client]
default-character-set=utf8mb4

Ale musisz również zmienić definicje tabeli :

Zakładając, że tabela jest CHARACTER SET utf8 i poprawnie zakodowany w UTF8; Chcesz UTF8MB4:

ALTER TABLE tbl CONVERT TO CHARACTER SET utf8mb4;

Aby zmienić jedną kolumnę CHARACTER SET utf8, która jest prawidłowo zakodowana w UTF8; I chcesz UTF8MB4 bez dotykania innych kolumn:

ALTER TABLE tbl MODIFY COLUMN col ... CHARACTER SET utf8mb4;

(Pamiętaj, aby zachować inne specyfikacje - Varchar, a nie Null itp.)

Więcej

Wszelkie prawidłowo zakodowane dane w tabelach zostaną przekonwertowane na UTF8MB4 (praktycznie no-op).

Eksperymentować:

CREATE TABLE test LIKE existing_table;
SHOW CREATE TABLE;  -- to see the old schema
INSERT INTO test SELECT * FROM existing_table;
ALTER TABLE test CONVERT TO CHARACTER SET utf8mb4;
SHOW CREATE TABLE;  -- to see the new schema
SELECT * FROM test;  -- to see the data
SELECT col, HEX(col) FROM test WHERE ...;  -- to check encoding

Gdzie

`existing_table` is some table with utf8 characters in it.
`col` and `...` limit the SELECT to one row with accented letters.
1
Rick James 19 styczeń 2020, 01:33