一个简单而愚蠢的故事,关于我们今天的小虫子。

今天,我和我的团队在Kurio,有一些有趣的时刻,但也很愚蠢。当我们尝试通过我们新的简单 CRUD API 服务将表情符号存储到 Mysql 中的存储时,就会发生这种情况。

我们正在制作我们的内容团队使用的内部服务,只是一个简单的 CRUD。堆栈只是:Angular + Golang + Mysql。

这些服务已经部署到生产环境并且已经被我们的内容团队使用。一切正常,因为它已经从 staging 到发布进行了测试。直到,当我们的一个内容团队开始将项目存储到此服务时,有效负载有一些表情符号。就在那时我们意识到了这个愚蠢的错误。

有效载荷更像这样:

{"type": "text","text": "😈🤠 很抱歉给你带来了痛苦😱","color": "#FFFFFF"}

并返回有关要存储的值不正确的错误。

“数字”:1366“消息”:“不正确的字符串值:'\xF0\x9F\x98\x88 \xF0...' 用于第 1 行的列 'text'”

幸运的是,这个服务是供我们内容团队内部使用的,用户负载不是很大,所以还是可以忍受的😈。我无法想象如果我们将它发布给我们的真实用户会发生什么。

解决问题

为了解决这个问题,我们做了一些与这个问题相关的事情。

  • 更改数据库的字符集编码和排序规则

  • 将连接驱动程序的字符集编码和排序从我们的应用程序(Golang)更改为 Mysql Server

更改数据库编码字符集和排序规则

![](data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%27285%27%20height=%27116%27/%3e)图像

<img altu003d"image" srcsetu003d"/_next/image?urlu003dhttps%3A%2F%2Fcdn.hackernoon.com%2Fhn-images%2F1*SUVbutxte_c_IcwzOc2HUQ.png&wu003d384&qu003d75 1x, /_next/image?urlu003dhttps%3A%2F%2Fcdn.hackernoon.com%2Fhn-images%2F1*SUVbutxte_c_IcwzOc2HUQ.png&wu003d640&qu003d75 2x" srcu003d"/_next/image?url u003dhttps%3A%2F%2Fcdn.hackernoon.com%2Fhn-images%2F1*SUVbutxte_c_IcwzOc2HUQ.png&wu003d640&qu003d75" 解码u003d"async" data-nimgu003d"intrinsic" styleu003d"position:absolute ;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min -width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:contain" classu003d"image" loadingu003d"lazy">

我们更改前的默认字符集

utf-8
utf8mb4utf-8utf-8utf-8utf8mb4

要更改整个数据库的字符集和排序规则:

ALTER DATABASE    database_name    CHARACTER SET = utf8mb4    COLLATE = utf8mb4_unicode_ci;

更改整个特定表的字符集和排序规则

ALTER TABLE    table_name    CONVERT TO CHARACTER SET utf8mb4    COLLATE utf8mb4_unicode_ci;

所以在做了这个之后,我们认为我们已经解决了我们的问题。但是,在我们再次测试它之后,我们仍然没有修复它。它仍然返回相同的错误。

在 Mysql 驱动程序中更改连接字符集

github.com/go-sql-driver/mysql

前:

dsn :u003d @037

dbConn, _:u003d sql.Open(@038, dsn)

后:

dsn :u003d@039**

dbConn, _:u003d sql.Open(@040, dsn)

好了,做完这些,现在我们的服务运行良好,可以接受任何表情符号。

结论

这个bug不算大,老实说,是个又傻又好笑的bug。但看起来每个人都曾落入这个陷阱😥。但是今天我学到了一些东西,我们在创建数据库时应该小心,无论它是什么类型(RDBMS,NoSQL)

参考:

  1. Selvamani P 在 stackoverflow.comhttps://stackoverflow.com/a/39465494中的回答

Mathias Bynens 在 dba.stackexchange.comhttps://dba.stackexchange.com/a/21684中的回答

如果你觉得这篇文章有用或有趣,请分享到你的网络圈,或者你可以鼓掌帮助其他人达到这个目的。如果您有任何问题或其他事情,请在下方回复。