PHP 7与Doctrine 2.4.3:将列字符集从utf8改为utf8mb4
嘿,我刚好处理过类似的场景,给你几个可行的办法来通过Doctrine实体注解实现utf8mb4字符集的设置,完美支持表情符号:
1. 单个字段直接指定字符集
最直接的方式就是在需要支持表情的实体属性上,通过@Column注解明确指定charset和collation参数:
/** * @ORM\Column( * type="string", * length=255, * charset="utf8mb4", * collation="utf8mb4_unicode_ci" * ) */ private $content;
这样Doctrine生成或更新表结构时,这个字段就会使用utf8mb4字符集,完全兼容4字节的表情符号。
2. 整个实体/表统一设置字符集
如果你的整张表大多数字段都需要支持表情,可以直接在实体的@Table注解里配置全局字符集,所有字段会默认继承这个设置:
/** * @ORM\Entity * @ORM\Table( * name="posts", * options={"charset"="utf8mb4", "collate"="utf8mb4_unicode_ci"} * ) */ class Post { // 这里的字段都会默认使用utf8mb4,个别字段可以单独覆盖 /** * @ORM\Column(type="string", length=100) */ private $title; /** * @ORM\Column(type="text") */ private $content; }
3. 必须同步调整数据库连接配置
光改实体注解还不够,得确保Doctrine和MySQL的连接也用utf8mb4,不然插入数据时还是会出现乱码或截断问题。修改你的数据库连接配置:
$connectionParams = [ 'dbname' => 'your_database', 'user' => 'db_user', 'password' => 'db_pass', 'host' => 'localhost', 'driver' => 'pdo_mysql', // 直接指定连接字符集 'charset' => 'utf8mb4', 'driverOptions' => [ // 强制初始化连接时设置字符集 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci' ] ]; $entityManager = EntityManager::create($connectionParams, $config);
4. 后续操作注意事项
- 如果你是在已有项目上修改,记得运行Doctrine迁移命令来同步数据库结构:
(如果是非Symfony项目,用对应的Doctrine迁移命令即可)php bin/console doctrine:migrations:diff php bin/console doctrine:migrations:migrate - 确认你的MySQL 5.7.21已经启用了InnoDB引擎(默认都是),并且如果字段长度超过191字符,可开启
innodb_large_prefix参数来支持更长的字段。
内容的提问来源于stack exchange,提问作者Gummy
相关产品推荐
相关产品推荐

