我正在为网站使用繁荣库。我的客户要求我们应该能够在手机上使用表情符号。理论上,我们应该将 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.)
然后每个字符将使用四个字节而不是三个字节。这将使数据库的大小增加 33%。这将导致更差的性能和更多的存储空间被用完。因此,我们决定只为特定表的特定列切换到 utf8mb4 编码。
为了确保一切正常,我检查了几件事。其中,我检查了flavourlib,发现了几个可疑的部分:
有一个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);
我怀疑繁荣库不支持我们使几个表的几列具有utf8mb4字符编码的任务。我想知道我们是否可以以某种方式升级某些东西来提供这种支持。作为最坏的情况,我们可以将每个文本出现的 utf8 覆盖为 utf8mb4。但是,这将是一个非常丑陋的 hack,我们想知道是否有更好的解决方案。我们应该进行这种破解还是有更正统的方法?