在写完一篇博客后上传到服务器时突然来了个Internal Server Error 于是查看日志发现数据库报错
mysql.connector.errors.DatabaseError) 1366 (HY000): Incorrect string value: '\xF0\x9F\x99\x83
通过搜索发现是因为博文中有一个表情?,而在mysql5.53之前的utf8字符集是不支持emoji的,因为其最多支持3个字节,而这个emoji则大于3字节。不过我的服务器mysql版本是5.75,所以只要设置为utf8mb4字符集就可以了,设置方法网上有很多,比如MySQL数据库字符集由utf8修改为utf8mb4一例这一篇。
可是设置完之后连接数据库时又出现了一个奇怪的错误Unknown collation: 'utf8mb4_0900_ai_ci'
,这又是什么鬼?于是再次搜索,发现出错的都是8.x版和5.x版的字符排序不同而进行同步时出的错误,但是我并没有同步,而且本机8.x版数据库是一切正常的。这就意味着服务器上博客程序作为客户端跟mysql连接时出了问题,排查发现将数据库连接引擎有MySQL官方的mysqlconnector改为pymysql后问题得到解决。
果然,在MySQL官方论坛中搜索发现了这个问题,https://forums.mysql.com/read.php?50,677424,677981#msg-677981
Re: 8.0.17 bug: unknown collation utf8mb4_0900_ai_ci
Posted by: Nuno Mariz
Date: September 05, 2019 03:19AM
Hi, Yes, Connector/Python sets the collation to utf8mb4_0900_ai_ci
when utf8mb4 charset is used. This was changed in 8.0.17. Please use
collation=“utf8mb4_general_ci” in the connection options for older
MySQL versions.
是因为官方提供的python连接引擎Connector/Python在字符集被设置为utf8mb4时会将collation
设置为utf8mb4_0900_ai_ci
,而这在5.x版本设置collation-server = utf8mb4_unicode_ci
时是不兼容的,应改为utf8mb4_general_ci
。
至此这个问题终于弄清并得以解决?。