我尝试了以下步骤将 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;
5.5和5.6有191问题。5.7解决了这个问题。
有关5.5/5.6 中多种解决方法的讨论,请参阅此内容。您引用的两篇文章都已过时,因为它们讨论的是 5.5。(请注意,我已经对两者发表了评论。)
无论如何,我建议您将
255
每列更改为一些合理的限制。一个警告
ALTER .. CONVERT TO ..
- 如果country_code
是它应该是什么,即CHARACTER SET ascii
;ALTER
会将其更改为utf8mb4
.第二季度...
列
CHARSET
的重要。表CHARSET
的只是列的默认值。数据库和任何新创建的表也是如此。我不喜欢依赖这种默认设置,并且我
CHARSET
在任何表 I 上明确声明CREATE
。其他人可能更喜欢做一个ALTER DATABASE
.