Я использую flourishlib для веб-сайта. Мой клиент попросил, чтобы мы могли использовать emojis с мобильными телефонами. Теоретически мы должны изменить кодировку символов с utf8 на utf8mb4 для базы данных MySQL.
Пока, так хорошо, однако, если мы сделаем этот переключатель, вот так:
# For each database: ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE utf8mb4_unicode_ci; # For each table: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # For each column: ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # (Don't blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
Затем каждый символ будет использовать четыре байта вместо трех байтов. Это увеличит размер базы данных на 33%. Это приведет к ухудшению производительности и увеличению объема памяти. Итак, в результате мы решили переключиться на кодировку utf8mb4 только для определенных столбцов конкретных таблиц.
Чтобы убедиться, что все в порядке, я проверил несколько вещей. Среди них я проверил мушлиблиб и обнаружил несколько подозрительных частей:
Существует класс fUTF8, который, похоже, не поддерживает utf8mb4
В fDatabase я цитирую некоторые выводы:
if ($this->connection && function_exists('mysql_set_charset') && !mysql_set_charset('utf8', $this->connection)) { throw new fConnectivityException( 'There was an error setting the database connection to use UTF-8' ); } //... // Make MySQL act more strict and use UTF-8 if ($this->type == 'mysql') { $this->execute("SET SQL_MODE = 'REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE'"); $this->execute("SET NAMES 'utf8'"); $this->execute("SET CHARACTER SET utf8"); }
В fSQLSchemaTranslation я вижу это:
$sql = preg_replace('#\)\s*;?\s*$#D', ')ENGINE=InnoDB, CHARACTER SET utf8', $sql);
У меня есть подозрение, что flourishlib не будет поддерживать наши попытки сделать несколько столбцов из нескольких таблиц, имеющих кодировку символов utf8mb4. Интересно, можем ли мы что-то обновить, чтобы сделать эту поддержку. В худшем случае мы можем переопределить каждое текстовое событие utf8 до utf8mb4. Однако это было бы очень уродливым взломом, и мы задаемся вопросом, есть ли лучшее решение. Должны ли мы сделать этот взлом или есть более ортодоксальный подход?