gpt4 book ai didi

mysql - 如何在没有base64编码的情况下将blob数据从ruby提交到MySQL

转载 作者:行者123 更新时间:2023-11-30 22:55:40 25 4
gpt4 key购买 nike

我搜索过如何最好地将二进制数据提交到 BLOB 类型的 MySQL 字段,而不进行会增加数据大小的 base64 编码,但没有取得太大成功。

到目前为止,我的 Ruby 代码看起来像这样:

require 'zlib'
require 'base64'
require 'mysql'

#Initialization of connection function
db = Mysql.init
db.options(Mysql::OPT_COMPRESS, true)
db.options(Mysql::SET_CHARSET_NAME, 'utf8')
dbh = db.real_connect('hostname','username','password','database') #replace with appropriate connection details

#Saving the data function
values=someVeryBigHash
values=JSON.dump(values)
values=Zlib::Deflate.deflate(values, Zlib::BEST_COMPRESSION)
values=Base64.encode64(values)
dbh.query("update `SomeTable` set Data='#{values}' where id=1")
dbh.close if dbh

#Retrieving the data function
res=dbh.query("select * from `SomeTable` where id=1")
data=res['Data']
data=Base64.decode64(data)
data=Zlib::inflate(data)
data=JSON.parse(data)

问题是使用 Base64 编码/解码不是很有效,我想找一些更干净的东西。

我还尝试了使用 Marhsal 的替代方法(它不允许我在没有 base64 编码的情况下发送数据,但更紧凑一些)

 #In the saving function use Marshal.dump() instead of JSON.dump()
values=Marshal.dump(values)

#In Retrieve function use Marshal.load() (or Marshal.restore()) instead of JSON.parse(data)
data=Marshal.load(data)

但是,我遇到了一些错误(也许有人发现了我做错了什么,或者知道为什么会发生这种情况):

incompatible marshal file format (can't be read) version 4.8 required; 34.92 given

我尝试了使用/不使用 Base64 编码或解码或使用/不使用 ZLib 压缩的不同风格。但我似乎总是出错。

如何在没有 base64 编码的情况下使用 Ruby 和 mysql gem 发送二进制数据。还是仅要求使用 base64 编码发送数据?

最佳答案

The issue is that using Base64 encoding/decoding is not very efficient and I was hopping for something a bit cleaner.

你正在使用 JSON 将大哈希值转换为字符串,然后对二进制数据使用 ZLib 压缩,然后对生成的二进制数据进行 Base64 编码,你担心效率......我假设你意味着空间效率而不是时间效率。

我想我最好奇的是你为什么首先要使用 Base64 编码 - BLOB 是一种二进制数据格式,如果你将字节数组传递给 ZLib,它应该无论如何都会正确地扩充它。

您是否尝试过将二进制数据直接写入数据库?您遇到了什么问题。

编辑:

update SomeTable set Data='xڍ�]o�0��K$�k;�H��Z�*XATb�U,where id=1' resulted in an error... Obviously this has to do with the binary nature of the data. This captures the essence of my question. Hope you shine some light on this issue.

您不能像此处那样只将二进制字符串作为查询值传递 - 我认为您需要使用带有绑定(bind)变量的查询。

我不确定您使用的 mysql gem 是否支持查询绑定(bind)参数,但您使用的查询格式类似于:

@db.execute('update SomeTable set Data=? where id = 1', <binary data value>) 

这将允许 mysql 正确转义或封装要插入到数据库表中的二进制数据。

关于mysql - 如何在没有base64编码的情况下将blob数据从ruby提交到MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26484120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com