我正在使用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