【问题标题】:How to save and retrieve string with accents in redis?如何在redis中保存和检索带重音符号的字符串?
【发布时间】:2012-01-22 18:16:15
【问题描述】:

我无法在我的 redis 数据库中设置和检索带有重音符号的字符串。
带有重音符号的字符已编码,我如何在设置时将它们检索回来?

redis> set test téléphone
OK
redis> get test
"t\xc3\xa9l\xc3\xa9phone"

我知道这已经被问过了 (http://stackoverflow.com/questions/6731450/redis-problem-with-accents-utf-8-encoding)但没有详细的答案。

【问题讨论】:

    标签: redis


    【解决方案1】:

    Redis 服务器本身将所有数据存储为二进制对象,因此它不依赖于编码。服务器将只存储客户端发送的内容(包括 UTF-8 字符)。

    这里有一些实验:

    $ echo téléphone | hexdump -C
    00000000  74 c3 a9 6c c3 a9 70 68  6f 6e 65 0a              |t..l..phone.|
    

    c3a9 是 'é' 字符的表示。

    $ redis-cli
    > set t téléphone
    OK
    > get t
    "t\xc3\xa9l\xc3\xa9phone"
    

    实际上数据是正确存储在 Redis 服务器中的。但是,当它在终端中启动时,Redis 客户端会解释输出并应用 sdscatrepr function 来转换不可打印的字符(其定义取决于语言环境,并且无论如何都可能被多字节字符破坏)。

    一个简单的解决方法是使用 'raw' 选项启动 redis-cli:

    $ redis-cli --raw
    > get t
    téléphone
    

    您自己的应用程序可能会使用其中一个客户端库而不是 redis-cli,因此在实践中应该不是问题。

    【讨论】:

    • 非常感谢,您的解释使事情变得更加清晰。没错,我正在使用 node-redis (node.js 模块)来查询数据库。我会检查 node-redis 如何使用“原始”选项。
    • 很好的解释!谢谢@Didier!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    相关资源
    最近更新 更多