ウェブサイトに flourishlib を使用しています。私のクライアントは、携帯電話で絵文字を使用できるようにすることを要求しました。理論的には、MySQL データベースの文字エンコーディングを utf8 から utf8mb4 に変更する必要があります。
ここまではとても良いですが、次のように切り替えると、次のようになります。
# 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.)
この場合、各文字は 3 バイトではなく 4 バイトを使用します。これにより、データベースのサイズが 33% 増加します。これにより、パフォーマンスが低下し、より多くのストレージ スペースが使用されます。そのため、特定のテーブルの特定の列のみを utf8mb4 のエンコーディングに切り替えることにしました。
すべてが正しいことを確認するために、いくつかのことを確認しました。その中で、flourishlib を調べたところ、疑わしい部分がいくつか見つかりました。
utf8mb4 をサポートしていないように見える fUTF8 クラスがあります。
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);
私は、いくつかのテーブルのいくつかの列に utf8mb4 の文字エンコーディングを持たせるという私たちの探求を、flolishlib がサポートしないのではないかと疑っています。これをサポートするために何かをアップグレードできないかと思います。最悪のシナリオとして、utf8 のすべてのテキストを utf8mb4 にオーバーライドできます。しかし、それは非常に醜いハックであり、より良い解決策があるかどうか疑問に思っています. このハックを作成する必要がありますか、それとももっと正統なアプローチがありますか?