我需要在字段的特定编码上实现排序的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
中接收整个语句; - 将仅“a”转换为
gbk
并存储;和 - 按原样将“b”存储到数据库中?
非常感谢你们!
最佳答案
是的。
- 您在连接时指定客户端的编码。
- 您指定要插入的列的编码(“字符集”)。
MySQL 在 INSERTs
行时从一种编码转换为另一种编码。同样,它在 SELECTing
时转换为另一种方式。
CONVERT
函数不应该(通常)用于任何事情。
您正在使用 Java? characterEncoding=utf8 和 useUnicode=true
用于声明客户端。
“gbk”代表单列?寻找。该列的处理方式与其他列不同。
关于mysql - MySQL 服务器是否隐式支持编码转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70361330/