【问题标题】:MySQL Error 1366 when converting JSON to TEXT with certain characters将 JSON 转换为具有某些字符的 TEXT 时出现 MySQL 错误 1366
【发布时间】:2020-07-20 09:14:49
【问题描述】:

更新:以下是显示 TEXT 与 JSON 和具有相同数据的全局变量的行为方式不同的附加信息。更奇怪的是,var_json 和 @var_char1 的 CHARSET 和 COLLATION 与 TEXT 变量 (utf8mb4/utf8mb4_unicode_ci) 完全相同。

DECLARE var_char text;
DECLARE var_json json;
-- The CHARSET and COLLATION of var_char is utf8mb4 and utf8mb4_unicode_ci
SET var_json = '{"This": "• ® is a test"}'; -- Works Fine
SET @var_char1 = 'This • ® is a test'; -- Works Fine
SET var_char = 'This • ® is a test'; -- ERROR 1366 \x95 \xAE
SET var_char = CONVERT('This • ® is a test' USING utf8); -- Replaces specials with ? ? and works
SET var_char = CONVERT('This • ® is a test' USING utf8mb4); -- returns NULL ?!

为什么当 TEXT 变量与全局/JSON 变量共享完全相同的字符集/排序规则时,它不会接受并保留特殊字符,从而保持正常?

===

我有一个问题,我必须提取 JSON 块并将它们转换为 TEXT 字符串以进行内部处理;问题是 MySQL 在像 • (/x95) 这样的简单字符上出现错误 1366。如果我使用全局变量,这不是问题(例如 @var 而不是 var TEXT);这似乎只发生在 TEXT 变量中。

我的字符集是:utf8mb4 我的排序规则是:utf8mb4_unicode_ci 我的 SQL 版本是:8.0.18 环境:Windows 10

下面的代码总是产生:错误代码:1366。不正确的字符串值:'\x95' for column 'var_char' at row 1

CREATE DEFINER = 'root'@'localhost'
PROCEDURE empowercrm_main.test_proc()
BEGIN
    DECLARE var_char text;
    set var_char = '•';
END

请注意,如果我使用 GLOBAL 变量(例如 @var_char),它可以正常工作。但我不需要使用全局变量来执行此操作!

当涉及到排序规则和字符问题时,MySQL 一直是一场噩梦。我在这个问题上摸不着头脑。另外,如果这个字符导致变量赋值出错,还有哪些其他字符会做同样的事情?

任何帮助将不胜感激。

【问题讨论】:

  • 有人对此有任何想法吗?我能够解决这个问题的唯一方法是将字符串转换为 UTF8,然后再转换回 UTF8MB4,这似乎很荒谬。

标签: mysql


【解决方案1】:

问题是我的连接的编码。我使用的是默认值 -> 当前 Windows 代码页。当我切换到 utf8mb4 -> Unicode (UTF-8) 时,问题就消失了。非常奇怪的是,失败发生在相互调用的非常复杂的存储过程中;为什么它利用连接编码超出了我的理解,因为服务器/系统正在发出调用并且它的编码设置正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    相关资源
    最近更新 更多