问题一个接一个,本以为mysqldump导出的数据库有问题,那就还是改用phpMyAdmin导出的数据表,结果发现导入后少了几十张表。
本以为是操作失误或者是权限的问题,反复试了几次之后,看导入记录才发现,丢失的表是因为发生“Unknown collation: 'utf8mb4_0900_ai_ci'”错误。
Unknown_collation-utf8mb4_0900_ai_ci.jpg
从网上查找的结果来看,出现这种错误通常是由于MySQL版本过低导致的,因为utf8mb4_0900_ai_ci是MySQL 8.0及以上版本引入的一种字符集排序规则。导出服务器使用的是8.0.x版MySQL,而导入服务器使用的是10.11.x版Mariadb,而上述字符集貌似只有在11.2版以上的Mariadb中才完全支持。
那么,想要解决问题,要么为Mariadb安装utf8mb4_0900_ai_ci字符集或者直接升级Mariadb,要么就是将原有数据库中的字符集进行调整。
其中最方便的方法就是升级数据库程序,将Mariadb升级到11.2版以后,或者就直接替换成MySQL8.0以上。
另外两种方法具体要看数据表的量,如果是少量的表和字段,那么调整原有的字符集也可行(就像下面的SQL语句可用于将指定表中的指定字段的排序规则修改为utf8mb4_general_ci),一旦量大替换就比较麻烦,必须使用特定脚本才行。

ALTER TABLE your_table_name MODIFY your_column_name VARCHAR(255)CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

但像我这种已经导出的数据库文件,其实也可以通过文本软件进行查找和替换。比如网上提供的某个方法:

sed -i 's/utf8mb4_0900_ai_ci/utf8_general_ci/g' YOUR_SQL_FILE_NAME.sql 

我按照这个命令执行了一遍,还是提示错误,因为替换之后的字符集变成了utf8mb3_general_ci。因此,为了避免出错,最好还是将字符集明确(或跟已建数据表的排序字符集保持一致,如utf8mb4_unicode_ci),即:

sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g' YOUR_SQL_FILE_NAME.sql 

至于为Mariadb安装字符集则涉及到配置文件,同样有一定的复杂度和出错概率。
原本想放弃Mariadb改用MySQL的,因为Debian 12只默认带Mariadb,所以还是通过修改备份数据库中的字符集解决了问题。

参考资料:
https://dba.stackexchange.com/questions/248904/mysql-to-mariadb-unknown-collation-utf8mb4-0900-ai-ci?newreg=9028640017e54a179d8f98aeb2fabe48
https://blog.51cto.com/u_16213424/7871843

最后修改:2025 年 01 月 06 日
如果觉得我的文章对你有用,请随意赞赏