我正在使用的一个网站繁荣利布。我的客户要求我们应该能够在手机上使用表情符号。理论上,我们应该将字符编码从utf8更改为MySQL数据库的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编码。
为了确保一切正常,我检查了几件东西。在这些人中,我查了一下面粉库,发现了几个可疑的部分:
我怀疑flourishlib将不支持我们将少数表中的几列具有utf8mb4字符编码的要求。我不知道我们是否能以某种方式升级一些东西来提供这种支持。在最坏的情况下,我们可以将utf8的每一个文本出现覆盖到utf8mb4.然而,这将是一次非常丑陋的攻击,我们怀疑是否有更好的解决办法。我们应该进行这一黑客攻击,还是有一种更正统的方法?
发布于 2015-09-09 13:14:29
我已经解决了这个问题。通过更改列字符集和排序规则,我修改了想要支持表情符号的表,如下所示:
ALTER TABLE table_name CHANGE column_name column_name text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;在那之后,我不得不做一些丑陋的黑客,使繁荣自由能够支持表情符号。
fDatabase.php
第685行:
if ($this->connection && function_exists('mysql_set_charset') && !mysql_set_charset('utf8mb4', $this->connection)) {
throw new fConnectivityException(
'There was an error setting the database connection to use UTF-8'
);
}第717行保持不变,如果更改该行,所有内容都会崩溃:
if ($this->connection && function_exists('mysqli_set_charset') && !mysqli_set_charset($this->connection, 'utf8')) {第800项:
// 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 'utf8mb4'");
$this->execute("SET CHARACTER SET utf8mb4");
}fSQLSchemaTranslation.php
第1554行:
$sql = preg_replace('#\)\s*;?\s*$#D', ')ENGINE=InnoDB, CHARACTER SET utf8mb4', $sql);fXML.php
第403行:
if (preg_replace('#[^a-z0-9]#', '', strtolower($encoding)) == 'utf8mb4') {
// Remove the UTF-8 BOM if present
$xml = preg_replace("#^\xEF\xBB\xBF#", '', $xml);
fCore::startErrorCapture(E_NOTICE);
$cleaned = self::iconv('UTF-8', 'UTF-8', $xml);
if ($cleaned != $xml) {
$xml = self::iconv('Windows-1252', 'UTF-8', $xml);
}
fCore::stopErrorCapture();
}最后,当对任何受影响的列进行修改时,我将执行以下操作:
App::db()->query("set names 'utf8mb4'");它本质上触发了->query()对象的fDatabase执行。
发布于 2015-09-08 06:41:48
将数据库的大小增加33%。
不是这样的。英文字母仍然每个1字节。你在utf8mb4中获得的是存储表情符号和一些汉字的能力。
您不应该需要ALTER ... CHANGE列。除了你可能有一个罐装的VARCHAR(255)有问题。不要简单地切换到191,而是为每一列切换到一个“合理”的数字。或者什么都不做。191只来自INDEX限制。你不是在为每一列建立索引,是吗?
类,它似乎不支持
怨声载道。或者放弃它。(这些论坛中有太多的问题是关于第三方软件包不足的抱怨,而不是MySQL本身。)
您可能可以在utf8mb4中更改为MySQL,并让flourishlib忽略这一更改。从技术上讲,MySQL的utf8mb4与utf8的其他概念相匹配;MySQL的utf8是一个不完整的实现。
$this->execute(“设置名称'utf8'");
如果你能看到这段代码,你可以修改它。
https://stackoverflow.com/questions/32446440
复制相似问题