【发布时间】: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=utf8 和useUnicode=true。在 MySQL 的官方文档中我还没有找到这些参数的解释,但我想这些可以确保客户端和服务器之间的通信应该是 utf-8。
这就带来了问题。 MySQL服务器在接收数据时是否会隐式地将utf-8格式的数据转换为gbk? GET 参数是否只定义通信的字符集而不是最终存储数据的字符集?
编辑
评论说服务器确实转换了它们!谢谢大家!
我的进一步困惑是,只有一个字段设置为使用gbk,而其他所有字段都设置为使用utf8。这意味着服务器的字符集在全局范围内仍应为 utf8,但在本地仅用于该字段的 gbk。
假设现在我将这行脚本发送到服务器
INSERT INTO table (field_gbk, field_utf8) VALUES ("a", "b");
服务器是否:
- 在
utf8接收整个声明; - 将only“a”转换为
gbk并存储;和 - 将“b”原样存储到数据库中?
非常感谢各位!
【问题讨论】:
-
是的,客户端可以指定它将文本发送到数据库的编码,以及它想要返回的编码,并且 MySQL 知道存储在所有列中的所有文本的编码,它会根据需要在所有这些之间进行必要的转换。
-
@deceze 非常感谢!但是你对这个功能有任何官方参考吗?
-
MySQL服务器在接收到数据的时候会隐式的将utf-8的数据转换成gbk吗? 是的,转换是根据
character_set_server、character_set_client和character_set_connection会话设置。 -
@Akina - 处理客户端的编码。列的字符集处理另一边。