【发布时间】: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