首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将任意二进制数据插入到VARCHAR列中?

如何将任意二进制数据插入到VARCHAR列中?
EN

Stack Overflow用户
提问于 2016-06-16 04:51:02
回答 3查看 1.7K关注 0票数 0

我有一个包含VARCHAR(100)列的MySQL表,使用utf8_general_ci排序规则。

我可以看到此列包含任意字节序列(即包含无效UTF8字符序列的数据)的行,但我不知道如何编写允许输入此类数据的UPDATE或INSERT语句。

例如,我尝试了以下方法:

代码语言:javascript
复制
UPDATE DataTable SET Data = CAST(BINARY(X'16d7a4fca7442dda3ad93c9a726597e4') AS CHAR(100)) WHERE Id = 1;

但是我得到了一个错误:

代码语言:javascript
复制
Incorrect string value: '\xFC\xA7D-\xDA:...' for column 'Data' at row 1

如何编写绕过目标列排序规则的INSERT或UPDATE语句,从而允许插入任意字节序列?

EN

回答 3

Stack Overflow用户

发布于 2016-06-16 04:56:10

您是否考虑过使用其中一种Blob数据类型来代替varchar?我相信这将大大减轻你的用例带来的痛苦。

编辑:或者,还有MySQL支持的HEX and UNHEX函数。十六进制参数可以是字符串,也可以是数值参数,并将参数的十六进制表示形式返回为字符串。Unhex做了相反的事情;接受一个十六进制字符串并返回一个二进制字符串。

票数 0
EN

Stack Overflow用户

发布于 2016-06-23 00:23:52

简而言之,不应该将包含无效UTF8字符的值插入到声明为使用UTF8字符集的VARCHAR列中。

这就是MySQL的设计目标:禁止无效值。当有人尝试这样做时,MySQL将返回一个错误或警告,或者(更宽松?)在遇到第一个无效字符时以静默方式截断提供的值。

更常见的字符集问题是MySQL在不需要字符集转换时执行字符集转换。

但是您报告的问题是在UTF8列中插入了无效字符。这就好像提供了latin1 (ISO8859)编码,并且需要进行字符集转换,但没有执行。

就解决这个问题而言...我相信这在MySQL的早期版本中是可能的。我相信有可能将一个值转换为二进制,然后在CONVERT( ... USING UTF8)中扭曲它,MySQL不会执行字符集的验证。我不知道目前的MySQL连接器是否仍然可以做到这一点。

如果可能的话,那就是(IMO)连接器中的bug。

我能想到的绕过字符集检查/验证的唯一方法是让MySQL服务器信任客户端,并确定不需要对字符集进行检查。(这也意味着MySQL服务器不会执行字符集转换,客户端向服务器撒谎,客户端告诉服务器它提供的是有效的UTF8字符。

基本上,客户端会告诉服务器“嘿,服务器,我要发送UTF8字符编码”。

服务器说:“好吧,既然我们匹配,那我就不做任何字符集转换了。我只会相信你发送的是有效的UTF8”。

然后客户端调皮地笑着对自己说,“嘿,嘿,我说谎了。我实际上发送的字符编码不是有效的UTF8”。

而且我认为更有可能的是,使用准备好的语句和老式的MySQL C应用程序接口(mysql_stmt_preparemysql_stmt_execute),提供无效的UTF8编码作为字符串绑定参数的值。(客户端有责任为绑定参数提供有效的值。)

票数 0
EN

Stack Overflow用户

发布于 2016-06-16 18:13:26

您应该预先对您的值进行base64编码,以便可以使用它生成有效的SQL:

代码语言:javascript
复制
UPDATE DataTable SET Data = from_base64('mybase64-encoded-representation-of-my-value') WHERE Id = 1;
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37845529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档