Изменение кодировки и сопоставления базы данных JUST MySQL (приложение Rails) - PullRequest
0 голосов
/ 27 апреля 2020

Похоже, я имею дело с довольно распространенной проблемой. Моя производственная база данных MySQL имеет набор символов по умолчанию и сопоставление latin1 / latin1_swedish_ci. Я забыл изменить это на ранней стадии, и мое приложение Rails выросло до приличного размера с международной аудиторией; не-английские sh символы вызывают исключения, в то время как смайлики отображаются в виде вопросительных знаков.

Я знаю, что передо мной стоит большая задача по конвертации в utf8mb4 / utf8mb4_general_ci. Из того, что я понимаю, если я просто запускаю что-то вроде this , мои данные могут оказаться скомпрометированы.

Кажется довольно простым изменить кодировку / сопоставление для всей базы данных следующим образом:

ALTER DATABASE mydbname CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

У меня вопрос, изменится ли ТОЛЬКО кодировка базы данных / collation немедленно повлияет на чтение и запись? Или это просто устанавливает sh какая кодировка применяется при создании новых таблиц в базе данных?

Если я хочу в конечном итоге преобразовать все свои таблицы, кажется, что первым шагом было бы сначала разобраться с уровнем всей базы данных ... но какие побочные эффекты будут иметь место немедленно?

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Остерегайтесь ALTER. Если вы используете неправильный аромат, это усугубит ситуацию.

Вот контрольный список, который приводит к тому, какой аромат ALTER использовать: http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases

1 голос
/ 27 апреля 2020

Да, смена кодировки работает немедленно, но на уровне базы данных она изменяет только кодировку по умолчанию для новых таблиц, чтобы заставить ее работать с существующими столбцами, необходимо изменить кодировку на уровне столбцов. При этом вы можете столкнуться с ошибками, такими как нехватка места на диске (при преобразовании из 1-байтового в 2-байтовый или 4-байтовый вам потребуется больше места) или переполнение максимального выделенного пространства строк на таблицу, если таблица имеет много столбцов VARCHAR, поскольку MySQL не может выделять более 66 КБ на строку, см. здесь .

...