首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何大力支持表情符号?

如何大力支持表情符号?
EN

Stack Overflow用户
提问于 2015-09-07 21:49:30
回答 2查看 202关注 0票数 0

我正在使用的一个网站繁荣利布。我的客户要求我们应该能够在手机上使用表情符号。理论上,我们应该将字符编码从utf8更改为MySQL数据库的utf8mb4。

到目前为止,很好,但是,如果我们做出这样的转换,像这样:

代码语言:javascript
复制
# 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编码。

为了确保一切正常,我检查了几件东西。在这些人中,我查了一下面粉库,发现了几个可疑的部分:

  1. 有一个fUTF8类,它似乎不支持utf8mb4
  2. 在fDatabase,我引用了一些发现: 如果($this->connection && function_exists('mysql_set_charset') &!mysql_set_charset(‘UTF 8’,$this->fConnectivityException)){抛出新的fConnectivityException(‘设置数据库连接使用UTF-8’时出错);}/. //使MySQL更加严格,并使用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字符集utf8");}
  3. 在fSQLSchemaTranslation,我可以看到以下内容: $sql = preg_replace('#)\s*;?\s*$#D',')ENGINE=InnoDB,字符集utf8 8‘,$sql);

我怀疑flourishlib将不支持我们将少数表中的几列具有utf8mb4字符编码的要求。我不知道我们是否能以某种方式升级一些东西来提供这种支持。在最坏的情况下,我们可以将utf8的每一个文本出现覆盖到utf8mb4.然而,这将是一次非常丑陋的攻击,我们怀疑是否有更好的解决办法。我们应该进行这一黑客攻击,还是有一种更正统的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-09 13:14:29

我已经解决了这个问题。通过更改列字符集和排序规则,我修改了想要支持表情符号的表,如下所示:

代码语言:javascript
复制
ALTER TABLE table_name CHANGE column_name column_name text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

在那之后,我不得不做一些丑陋的黑客,使繁荣自由能够支持表情符号。

fDatabase.php

第685行:

代码语言:javascript
复制
        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行保持不变,如果更改该行,所有内容都会崩溃:

代码语言:javascript
复制
if ($this->connection && function_exists('mysqli_set_charset') && !mysqli_set_charset($this->connection, 'utf8')) {

第800项:

代码语言:javascript
复制
    // 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行:

代码语言:javascript
复制
$sql = preg_replace('#\)\s*;?\s*$#D', ')ENGINE=InnoDB, CHARACTER SET utf8mb4', $sql);

fXML.php

第403行:

代码语言:javascript
复制
    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();
    }

最后,当对任何受影响的列进行修改时,我将执行以下操作:

代码语言:javascript
复制
App::db()->query("set names 'utf8mb4'");

它本质上触发了->query()对象的fDatabase执行。

票数 1
EN

Stack Overflow用户

发布于 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'");

如果你能看到这段代码,你可以修改它。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32446440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档