我正在使用 MySQL 8.0.4 ( rc4 ) 我需要 MySQL 8,因为它是唯一支持 CTE 的 MySQL 版本。
我的数据库是这样创建的:
CREATE DATABASE IF NOT EXISTS TestDB
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_general_ci;
USE TestDB;
SET sql_mode = 'STRICT_TRANS_TABLES';
CREATE TABLE IF NOT EXISTS MyTable (
(...)
Body LONGBLOB NOT NULL,
(...)
);
当我尝试将原始字节数据插入此描述字段时,收到此错误:
错误 1366:第 1 行“Body”列的字符串值不正确:“\x8B\x08\x00\x00\x00\x00...”
。
这是我正在使用的插入语句。
REPLACE INTO MyTable
SELECT Candidate.* FROM
(SELECT :Id AS Id,
(...)
:Body AS Body,
(...)
) AS Candidate
LEFT JOIN MyTable ON Candidate.Id = MyTable.Id
WHERE (
(...)
);
BLOB 的字符串值怎么可能不正确? BLOB 不是意味着我可以插入任何东西吗?
最佳答案
:
是什么东西?为什么要有嵌套查询?我们可以看看实际的 SQL 吗?您使用什么语言?听起来“绑定(bind)”试图应用字符集规则,但实际上不应该。我们可以看看替换 :
内容的代码吗?
BLOB
没有字符集。只要您能够通过解析器获取字节,就不会有问题。
但是,我发现这是一个更好的方法......
在应用程序语言中,生成一个十六进制字符串,然后在中使用它
INSERT INTO ... VALUES (..., UNHEX(the-hex-string), ...)
关于MySQL 在尝试向 BLOB 字段插入字节时尝试应用 UTF-8 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49827662/