【发布时间】:2016-07-15 10:07:10
【问题描述】:
使用 MySQL,我已将连接字符集设置为 UTF-8:
SET NAMES 'utf8mb4';
SET CHARACTER SET 'utf8mb4';
这样我就以 UTF-8 格式取回所有内容,即使对于具有 latin1_swedish_ci 排序规则的表(有一些)。
当我发送 UTF-8 INSERT 字符串以插入其中一个 latin1 表时,这些值是否会被编码为 latin1?
【问题讨论】:
使用 MySQL,我已将连接字符集设置为 UTF-8:
SET NAMES 'utf8mb4';
SET CHARACTER SET 'utf8mb4';
这样我就以 UTF-8 格式取回所有内容,即使对于具有 latin1_swedish_ci 排序规则的表(有一些)。
当我发送 UTF-8 INSERT 字符串以插入其中一个 latin1 表时,这些值是否会被编码为 latin1?
【问题讨论】:
第一偏好:使用特定于编程语言的连接参数作为“字符集”。
第二偏好:SET NAMES utf8mb4; --(无需引用)。
列/表上的CHARACTER SET独立此连接/SET NAMES。
连接/SET NAMES 声明了客户端中字节使用的编码。 INSERT/SELECT 将在它和列/表声明之间进行转换,因此您的 utf8-latin1 观察结果。
“当我发送 UTF-8 INSERT 字符串以插入其中一个 latin1 表时,这些值是否会被编码为 latin1?” -- 重申一下,您发送的字节必须根据SET NAMES 进行编码。如果可能,它们将被正确转换为表中的 latin1。我说“如果可能”是因为中文、表情符号等无法转换为 latin1,因为 latin1 处理的字符集非常有限(仅够西欧使用)。
【讨论】: