我试图从Firebird数据库中获取一些数据。我有一个字段"UID"
,其值为de6c50a94aee524d9d287a43158360f4
字符串(16)。
当我用Ruby获得它时,我得到了:
"UID"=>"\xDElP\xA9J\xEERM\x9D(zC\x15\x83`\xF4"
为什么我没有收到字符串?
conn.query(:hash , 'SELECT FIRST 1 UID FROM cmd').first
答案 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类型BINARY
或VARBINARY
,但CHARACTER SET OCTETS
的字段是二进制的。
您要检索的值可能是UUID。您需要将该值用作二进制文件,或者使用UUID_TO_CHAR选择人类可读的UUID字符串:
SELECT FIRST 1 UUID_TO_CHAR(UID) FROM cmd