Влияние на данные при изменении базы данных mysql с 'utf8' на 'utf8mb4' в django живом приложении - PullRequest
0 голосов
/ 17 января 2020

Я обслуживаю Django приложение с MySQL back-end с Apache 2. Я настроил базу данных с набором символов 'utf8'. Я хочу также хранить смайлики, поэтому мне нужно изменить кодировка 'utf8mb4' Я просто хочу знать, если я изменю свою конфигурацию, повлияет ли это на мои данные? это мой mysql .cnf файл

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

Это мои django настройки для mysql базы данных

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

Как это повлияет на мои ранее сохраненные данные? Кроме того, как мне это сделать, если я прямо добавлю default-character-set = utf8mb4 в файл конфигурации по умолчанию.

1 Ответ

0 голосов
/ 17 января 2020

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

Но вам также необходимо изменить определения таблицы :

Предполагая, что таблица CHARACTER SET utf8 и правильно закодирована в utf8; want utf8mb4:

ALTER TABLE tbl CONVERT TO CHARACTER SET utf8mb4;

Чтобы изменить один столбец, нужно указать CHARACTER SET utf8, который правильно закодирован в utf8; и вы хотите, чтобы utf8mb4 не касался других столбцов:

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

(Обязательно сохраните остальные спецификации - VARCHAR, NOT NULL и т. д. c.)

больше

Любые правильно закодированные данные в таблицах будут преобразованы в utf8mb4 (практически не работает).

Для экспериментов:

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

Где

`existing_table` is some table with utf8 characters in it.
`col` and `...` limit the SELECT to one row with accented letters.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...