我最近接手了一个 10 年前创建的旧项目。它使用 MySQL 5.1。
除其他外,我需要将默认字符集从 latin1 更改为 utf8。
例如,我有这样的表:
CREATE TABLE `users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `first_name` varchar(45) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL, `last_name` varchar(45) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL, `username` varchar(127) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, `email` varchar(127) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, `pass` varchar(20) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, `active` char(1) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL DEFAULT 'Y', `created` datetime NOT NULL, `last_login` datetime DEFAULT NULL, `author` varchar(1) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT 'N', `locked_at` datetime DEFAULT NULL, `created_at` datetime DEFAULT NULL, `updated_at` datetime DEFAULT NULL, `ripple_token` varchar(36) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL, `ripple_token_expires` datetime DEFAULT '2014-10-31 08:03:55', `authentication_token` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `index_users_on_reset_password_token` (`reset_password_token`), UNIQUE KEY `index_users_on_confirmation_token` (`confirmation_token`), UNIQUE KEY `index_users_on_unlock_token` (`unlock_token`), KEY `users_active` (`active`), KEY `users_username` (`username`), KEY `index_users_on_email` (`email`) ) ENGINE=InnoDB AUTO_INCREMENT=1677 DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC
我设置了自己的 Mac 来解决这个问题。没有想太多,我运行了安装 MySQL 5.7 的“brew install mysql”。所以我有一些版本冲突。
我下载了该数据库的副本并将其导入。
如果我尝试运行这样的查询:
ALTER TABLE users MODIFY first_name varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
我收到此错误:
ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'created' at row 1
我想我可以解决这个问题:
ALTER TABLE users MODIFY created datetime NULL DEFAULT '1970-01-01 00:00:00'; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0
但我得到:
ALTER TABLE users MODIFY first_name varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ; ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'created' at row 1
我必须更新每个值吗?
如果表为空或不是很大,我的建议是将创建语句导出为 .sql 文件,然后根据需要重写它们。如果您有任何现有数据,也可以这样做,即导出插入语句(我建议在单独的文件中作为创建语句执行此操作)。最后,删除表并执行第一个创建语句然后插入。
您可以使用mysqldumpMySQL 安装中包含的任一命令,也可以安装 MySQL Workbench,这是一个免费的图形工具,它还以非常可定制的方式包含此选项,而无需查找特定的命令选项。
mysqldump