【问题标题】:Does MySQL server implicitly support encoding conversion?MySQL 服务器是否隐式支持编码转换?
【发布时间】:2022-01-18 11:59:51
【问题描述】:

我需要在字段的特定编码上实现排序的SELECT没有 CONVERT

也就是说,通常我会这样做

SELECT * FROM table ORDER BY CONVERT(field USING gbk) COLLATE gbk_chinese_ci

但是由于某种原因,CONVERT 是不允许的。结果,我试图通过

来解决这个问题
ALTER TABLE table MODIFY field VARCHAR(xx) CHARACTER SET gbk COLLATE gbk_chinese_ci;

SELECT * FROM table ORDER BY field

它有效。那挺好的。但是我担心编码问题。

与 MySQL 服务器的连接包括参数characterEncoding=utf8useUnicode=true。在 MySQL 的官方文档中我还没有找到这些参数的解释,但我想这些可以确保客户端和服务器之间的通信应该是 utf-8。

这就带来了问题。 MySQL服务器在接收数据时是否会隐式地将utf-8格式的数据转换为gbk? GET 参数是否只定义通信的字符集而不是最终存储数据的字符集?


编辑

评论说服务器确实转换了它们!谢谢大家!

我的进一步困惑是,只有一个字段设置为使用gbk,而其他所有字段都设置为使用utf8。这意味着服务器的字符集在全局范围内仍应为 utf8,但在本地仅用于该字段的 gbk

假设现在我将这行脚本发送到服务器

INSERT INTO table (field_gbk, field_utf8) VALUES ("a", "b");

服务器是否:

  1. utf8接收整个声明;
  2. only“a”转换为gbk并存储;和
  3. 将“b”原样存储到数据库中?

非常感谢各位!

【问题讨论】:

  • 是的,客户端可以指定它将文本发送到数据库的编码,以及它想要返回的编码,并且 MySQL 知道存储在所有列中的所有文本的编码,它会根据需要在所有这些之间进行必要的转换。
  • @deceze 非常感谢!但是你对这个功能有任何官方参考吗?
  • MySQL服务器在接收到数据的时候会隐式的将utf-8的数据转换成gbk吗? 是的,转换是根据character_set_servercharacter_set_clientcharacter_set_connection 会话设置。
  • @Akina - 处理客户端的编码。列的字符集处理另一边。

标签: mysql character-encoding


【解决方案1】:

是的。

  • 连接时在客户端指定编码。
  • 您指定要插入的列的编码(“字符集”)。

MySQL 从一种编码转换为另一种编码,因为它INSERTs 行。同样,当SELECTing时,它转换为另一种方式。

CONVERT 函数不应(通常)用于任何事情。

您使用的是 Java 吗? characterEncoding=utf8 and useUnicode=true 用于声明客户端。

"gbk" 用于单列?找。该列的处理方式与其他列不同。

【讨论】:

    猜你喜欢
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    相关资源
    最近更新 更多