字符串意外转换为十六进制

时间:2014-06-25 09:13:54

标签: ruby firebird

我试图从Firebird数据库中获取一些数据。我有一个字段"UID",其值为de6c50a94aee524d9d287a43158360f4字符串(16)。

当我用Ruby获得它时,我得到了:

"UID"=>"\xDElP\xA9J\xEERM\x9D(zC\x15\x83`\xF4"

为什么我没有收到字符串?

conn.query(:hash , 'SELECT FIRST 1 UID FROM cmd').first

3 个答案:

答案 0 :(得分:2)

您收到的UID是二进制数组,在ruby中表示为packed字符串。要打开包装,请执行以下操作:

"\xDElP\xA9J\xEERM\x9D(zC\x15\x83`\xF4".unpack('n*').map { |x| x.to_s(16) }.join
# => "de6c50a94aee524d9d287a43158360f4"

答案 1 :(得分:1)

您的UID是128位值。可以使用unpack

构建UID的十六进制字符串表示形式
str = "%08x%04x%04x%04x%04x%08x" % UID.unpack("NnnnnN")
=> "de6c50a94aee524d9d287a43158360f4"

特定格式的原因是此代码实际上是UUID的

str = "%08x-%04x-%04x-%04x-%04x%08x" % UID.unpack("NnnnnN")
=> "de6c50a9-4aee-524d-9d28-7a43158360f4"

答案 2 :(得分:0)

正如我评论的那样,我猜你的Firebird数据库中UID的数据类型是CHAR(16) CHARACTER SET OCTETS,这是二进制数据类型。 Firebird不知道SQL类型BINARYVARBINARY,但CHARACTER SET OCTETS的字段是二进制的。

您要检索的值可能是UUID。您需要将该值用作二进制文件,或者使用UUID_TO_CHAR选择人类可读的UUID字符串:

SELECT FIRST 1 UUID_TO_CHAR(UID) FROM cmd