我尝试了以下步骤将 CHARSET 升级到 utf8mb4 并将其连接到现有的后端服务器。
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
更新数据库连接参数。
"user:pass@tcp(server:3306)/mydbcharset=utf8mb4&collation=utf8mb4_unicode_ci"
这是迁移前的用户表模式。
CREATE TABLE IF NOT EXISTS `users` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`email` VARCHAR(255) NOT NULL DEFAULT '',
`password` VARCHAR(255) NOT NULL DEFAULT '',
`country_code` CHAR(4) NOT NULL DEFAULT '',
`industry` VARCHAR(255) NOT NULL DEFAULT '',
`company_size` VARCHAR(255) NOT NULL DEFAULT '',
`company_name` VARCHAR(255) NOT NULL DEFAULT '',
`last_name` VARCHAR(255) NOT NULL DEFAULT '',
`first_name` VARCHAR(255) NOT NULL DEFAULT '',
`newsletter` TINYINT(1) NOT NULL DEFAULT 0,
`company_website` VARCHAR(255) NOT NULL DEFAULT '',
`job_title` VARCHAR(255) NOT NULL DEFAULT '',
`profile_picture` VARCHAR(255) NOT NULL DEFAULT '',
`verified` TINYINT(1) NOT NULL DEFAULT 0,
`p_updated_time` INT NOT NULL DEFAULT 0,
`created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY (`email`)
)ENGINE = InnoDB DEFAULT CHARSET=UTF8;
到目前为止一切正常。
我担心的是某些 VARCHAR 列的字符限制为 255。在这篇文章中https://mathiasbynens.be/notes/mysql-utf8mb4和此处接受的答案如何在 MySQL 5.5 中轻松地将 utf8 表转换为 utf8mb4说更新 varchar (255) 到 191 是必需的。但是,如果不这样做,我并没有遇到问题,现有数据库有大约 100 条用户记录,并且上述迁移的空运行运行良好。
问题是
- 从 utf8 移动到 utf8mb4 时是否必须检查和更新列长度,如果不是,可能会出现什么样的问题?
- 是否也必须更改数据库的CHARSET?为什么不只更改表格的字符集?
--更新--
对于遇到外键违规的人可以使用以下
SET FOREIGN_KEY_CHECKS=0;
-- Insert your other SQL Queries here...
ALTER TABLE tble_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SET FOREIGN_KEY_CHECKS=1;