在做数据备份的时候,经常会遇到需要存储用户评论、日志信息或者产品描述这类带中文的内容。很多人一开始会担心:非关系型数据库到底能不能好好处理中文?答案是肯定的,主流的非关系型数据库都支持中文,但具体怎么用,还真有些门道。
常见的非关系型数据库都支持中文
比如 MongoDB、Redis、Cassandra 这些主流 NoSQL 数据库,底层都基于 UTF-8 编码存储数据,而 UTF-8 本身就能完整支持中文字符。只要你的应用程序正确传递编码,数据库一般不会“乱码”。
以 MongoDB 为例,你完全可以插入一条包含中文的文档:
db.users.insert({
name: "张伟",
city: "北京",
bio: "喜欢摄影和旅行"
})
查出来还是原样,不会变成“å¼ ä¼Ÿ”这种鬼样子。关键在于,连接数据库的驱动、程序代码、终端环境都得统一用 UTF-8,否则问题就出在链路中间,而不是数据库本身。
Redis 存中文也没问题
有人觉得 Redis 是存键值对的,可能只适合英文 ID。其实不然,你可以直接把一段中文当作 value 存进去:
SET user:1001 "用户名:李娜,城市:上海"
GET user:1001
返回结果就是原始中文字符串。不过要注意,如果你用某些老版本的客户端工具查看数据,界面显示乱码,那多半是终端编码没设对,不是 Redis 不支持。
备份时更要留意编码一致性
数据备份是个关键环节。比如你用脚本导出 MongoDB 的数据,生成 JSON 文件,如果脚本默认用 GBK 写文件,而数据是 UTF-8 的,那中文就全毁了。正确的做法是在写文件时明确指定编码:
with open('backup.json', 'w', encoding='utf-8') as f:
f.write(json.dumps(data, ensure_ascii=False))
这里 ensure_ascii=False 很重要,不然 Python 会把中文转成 \u 转义序列,虽然不算错,但可读性差,也不方便后续处理。
别忽略索引和查询的细节
中文搜索时,单纯用字段匹配没问题,但要做模糊查询或全文索引,就得额外配置。比如 MongoDB 支持文本索引,可以为中文字段建立索引:
db.articles.createIndex({ title: "text", content: "text" })
但默认分词对中文不太友好,建议结合外部分词服务或使用 Elasticsearch 做增强。直接拿 LIKE %关键词% 那套思路用在 NoSQL 上,容易踩坑。
说到底,非关系型数据库对中文的支持已经很成熟,真正影响使用的反而是开发环境、脚本处理和备份流程中的小细节。只要从输入到输出整个链路保持编码一致,中文数据该存存,该备备,一点不耽误事。