我知道这并不完全是您正在寻找的答案,但许多人实际上会对以正确的方式修复它感兴趣,所以:
1.备份您的数据库:
mysqldump -h HOSTNAME -u USERNAME -p DATABASE_NAME > PATH_TO_FILE
例子:
mysqldump -h 127.0.0.1 -u root -p music > ~/music-db-backup.sql
这将询问您的数据库密码。如果您想在命令中包含密码 - 在 -p 之后添加密码,中间没有空格,例如-pJazzMusic.
2。更改您的字段字符集 utf8mb4 和排序规则为utf8mb4_0900_ai_ci(Unicode v9 兼容)。此外,更新表和数据库本身也是一个好主意。
更新数据库:
ALTER DATABASE <database-name>
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci
更新表:
一次性更新表及其字段:
(请记住,在较大的表上,它可能会花费大量时间并产生显着的 IO 峰值)
ALTER TABLE <table-name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
或者,也可以根据具体情况更新表和字段:
ALTER TABLE <table-name>
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci
这样预先存在的字段将保持其旧的字符集/排序规则。
转换单个字段:
ALTER TABLE <table-name>
MODIFY COLUMN <column-name> varchar(64)
CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci
NOT NULL;
3。建立连接以使用utf8mb4
您可以在连接后立即将此查询发送到您的数据库:
SET NAMES "utf8mb4"
MySQL Documentation - Set Names
或者查看您的数据库框架文档,了解如何以更简单的方式进行操作。
例如 TypeOrm 有charset 连接属性:
import { createConnection } from 'typeorm';
const connection = await createConnection({
type: 'mysql',
host: '127.0.0.1',
port: 3306,
charset: 'utf8mb4'
// ...
});