MYSQL: VIEW的DDL中的字符串数小时后变成乱码
MYSQL: Strings in DDL of VIEW turned into garbled symbols several hours later
我最近用Workbench修改了一个VIEW的DDL,添加了一个带有中文字符串的过滤器。修改后的DDL可以直接保存成功并完美运行。然而,DDL中的修改本身在几个小时后就变成了乱码。 character_set_database和部分列的字符集原来是utf8(utf8_general_ci)。收到错误后,我将它们全部设为默认排序规则 (utf8mb4_0900_ai_ci) 的 utf8mb4。改字符集后乱码确实变了,但还是乱码。有什么想法吗?
示例:
修改后的DDL: where m
.NAME
not in ('王晓明','张小英')
修改几个小时后的DDL:where m
.NAME
not in ('???D?','??\?')
环境:
MYSQL 8.0.13 社区服务器 - GPL
Windows10专业64位(繁体中文;打字输出字符集:UNICODE)
Workbench8.0.13
显示像“%char%”这样的变量
结果:
character_set_client utf8mb4
character_set_connectionutf8mb4
character_set_databaseutf8mb4
character_set_filesystem二进制
character_set_resultsutf8mb4
character_set_serverutf8mb4
character_set_systemutf8
character_sets_dir C:\Program Files\MySQL\MySQL 服务器 8.0\share\charsets\
请提供对 Windows UNICODE 的引用 -- 我们需要确定它是真正的 "Unicode code points" 还是 "UTF-8"。如果您可以提供一些文本的十六进制转储,我可以从中推断出答案。
更具体地说,王曉明張小英
,以 UTF-8 编码(MySQL 的 utf8 或 utf8mb4)是十六进制
E78E8B E69B89 E6988E E5BCB5 E5B08F E88BB1
(添加空格以分隔字符。)对于 Unicode(MySQL 的 UCS2):
738B 66C9 660E 5F35 5C0F 82F1
所以,如果你得到第二个十六进制,那么你需要声明客户端使用的是ucs2,而不是utf8mb4。同时,将表中的列设置为 utf8mb4 是非常合理的。 (我推荐这样的。)
"Character set" 对比 "collation":utf8mb4
是一个 "character set";它确定 "encoding" if 字节。 utf8mb4_0900_ai_ci
是一个 "collation";它决定了字符的排序顺序。您遇到的是编码问题,而不是排序问题。
"several hours after modification" -- 这让我想起了计算机术语"bug"的推导。大多数原始计算机都是由真空管制成的。飞蛾被灯管发出的光所吸引。它们有时会导致硬件问题。
Hex A4FDBEE5A9FA
是 王曉明
的 Big5 编码。
我最近用Workbench修改了一个VIEW的DDL,添加了一个带有中文字符串的过滤器。修改后的DDL可以直接保存成功并完美运行。然而,DDL中的修改本身在几个小时后就变成了乱码。 character_set_database和部分列的字符集原来是utf8(utf8_general_ci)。收到错误后,我将它们全部设为默认排序规则 (utf8mb4_0900_ai_ci) 的 utf8mb4。改字符集后乱码确实变了,但还是乱码。有什么想法吗?
示例:
修改后的DDL: where m
.NAME
not in ('王晓明','张小英')
修改几个小时后的DDL:where m
.NAME
not in ('???D?','??\?')
环境:
MYSQL 8.0.13 社区服务器 - GPL
Windows10专业64位(繁体中文;打字输出字符集:UNICODE)
Workbench8.0.13
显示像“%char%”这样的变量
结果:
character_set_client utf8mb4
character_set_connectionutf8mb4
character_set_databaseutf8mb4
character_set_filesystem二进制
character_set_resultsutf8mb4
character_set_serverutf8mb4
character_set_systemutf8
character_sets_dir C:\Program Files\MySQL\MySQL 服务器 8.0\share\charsets\
请提供对 Windows UNICODE 的引用 -- 我们需要确定它是真正的 "Unicode code points" 还是 "UTF-8"。如果您可以提供一些文本的十六进制转储,我可以从中推断出答案。
更具体地说,王曉明張小英
,以 UTF-8 编码(MySQL 的 utf8 或 utf8mb4)是十六进制
E78E8B E69B89 E6988E E5BCB5 E5B08F E88BB1
(添加空格以分隔字符。)对于 Unicode(MySQL 的 UCS2):
738B 66C9 660E 5F35 5C0F 82F1
所以,如果你得到第二个十六进制,那么你需要声明客户端使用的是ucs2,而不是utf8mb4。同时,将表中的列设置为 utf8mb4 是非常合理的。 (我推荐这样的。)
"Character set" 对比 "collation":utf8mb4
是一个 "character set";它确定 "encoding" if 字节。 utf8mb4_0900_ai_ci
是一个 "collation";它决定了字符的排序顺序。您遇到的是编码问题,而不是排序问题。
"several hours after modification" -- 这让我想起了计算机术语"bug"的推导。大多数原始计算机都是由真空管制成的。飞蛾被灯管发出的光所吸引。它们有时会导致硬件问题。
Hex A4FDBEE5A9FA
是 王曉明
的 Big5 编码。