php7和2.4.3:将列字符集从utf8更改为utf8mb4

dwthyt8l  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(486)

我正在做一个项目,使用Doctorin2.4.3和MySQL5.7.21数据库 utf8 作为默认字符集。
最近,我一直在寻求实现emoji支持。为了克服mysql的3字节限制 utf8 ,我需要将可以接收表情符号的列更改为 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 但是条令没有改变,我仍然不能插入4字节的表情符号。
如果我自己直接在mysql中更新列的字符集,emojis确实会得到支持,但是当我运行 orm:schema-tool:update ,条令看到了我的实体和模式之间的差异,但似乎不知道如何处理它,因为我得到的输出如下: ALTER TABLE post CHANGE text text LONGTEXT NOT NULL ; 我还试图补充 SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci 作为 driverOptions 在我的数据库连接配置数组中,也没有结果。
不幸的是,我在条令的文件中找不到任何关于这个问题的东西。
如果你们有任何关于这件事的线索,请随时打电话给我!提前谢谢。

6ie5vjzr

6ie5vjzr1#

要转换整个表:

ALTER TABLE tbl CONVERT TO CHARACTER SET utf8mb4;

请提供

SHOW CREATE TABLE ...

更多故障排除:utf-8字符故障;我看到的不是我储存的

5ktev3wc

5ktev3wc2#

由于我有遗留需求,目前无法更新条令的lib,所以我必须找到一个解决方法。
我所做的是手动将我的表转换为 utf8mb4 对于sql查询,它不会被返回到 utf8 执行时 orm:schema-tool:update --force 在字符集转换之后。
为此,我使用以下脚本生成了update语句:

SELECT CONCAT('ALTER TABLE ', t.table_schema, '.', t.table_name, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM information_schema.tables t
WHERE t.table_schema LIKE {your_schema};

^不要盲目地执行此操作-事先检查现有数据是否适合 utf8mb4 编码的。有关更多详细信息,请查看mathias bynens关于此问题的非常好的文章:https://mathiasbynens.be/notes/mysql-utf8mb4#column-索引长度
我还更改了数据库的字符集设置。

ALTER DATABASE {database_name} CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

我确实保留了 'charset' => 'utf8mb4' 在条令的数据库连接设置数组中正确传输数据。
对于新实体(表),在“表选项”中使用正确的设置对其进行注解会创建具有正确字符集和排序规则的实体:

@Entity @Table(name="table", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"})

干杯。

相关问题