我正在使用Doctrine 2.4.3和MySQL 5.7.21数据库(默认字符集为utf8)的项目。

最近,我一直在寻求实现表情符号支持。为了克服MySQL对utf8的3个字节的限制,我需要将可以接收表情符号的列更改为utf8mb4字符集(请参见https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html)。

但是,我还没有找到一种方法可以在我的实体中反映出来(使用注释)。

我的数据库连接配置如下:

$data = array(
    'driver' => 'pdo_mysql',
    'host' => $dbhost,
    'port' => $dbport,
    'dbname' => $dbname,
    'user' => $dbuser,
    'password' => $dbpw,
    'charset' => 'utf8mb4'
);


我尝试在表中添加注释:
/* @Entity(repositoryClass="path\to\DAO") @Table(name="post", indexes={@Index(name="uid", columns={"uid"})}, options={"charset":"utf8mb4", "collation":"utf8mb4_unicode_ci"}) * @HasLifecycleCallbacks */class Post extends BaseEntity{ ...}

以相同的方式,尝试向列(在同一表中)本身添加注释:
/* @Column(type="text", options={"charset":"utf8mb4", collation":"utf8mb4_unicode_ci"}) */protected $text;

以上都不起作用。我期望在执行ALTER TABLE时出现一个doctrine orm:schema-tool:update --dump-sql查询,但是Doctrine看不到任何变化,而且我仍然无法插入4个字节的表情符号。

如果我自己直接在MySQL中更新列的字符集,则表情符号会得到支持,但是当我运行orm:schema-tool:update时,Doctrine会看到我的实体与模式之间的差异,但自输出后似乎不知道该怎么做得到以下内容:
ALTER TABLE post CHANGE text text LONGTEXT NOT NULL ;

我还尝试将SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci作为driverOptions添加到数据库连接配置数组中,可惜也没有结果。

不幸的是,我在教义的文档中找不到任何与此有关的东西。

如果您有任何关于此事的线索,请随时打我!提前致谢。

最佳答案

转换整个表:

ALTER TABLE tbl CONVERT TO CHARACTER SET utf8mb4;


请提供

SHOW CREATE TABLE ...


有关更多故障排除:Trouble with UTF-8 characters; what I see is not what I stored

10-07 19:48
查看更多