1

我有一个表,其中包含一个 varchar(1024) 字段,其中包含具有十六进制编码字符串的字符串。该表是自动填充的,我必须提供一个 SP 以允许用户下载它,因此,我需要将十六进制更改回人类可读的形式。

如果我手动运行此语句(从字段中获取十六进制数据),它工作得很好:

SELECT X'5468697320697320612074657374206D6573736167652031323334353637383930';

但是我找不到在调用字段/列名时让它工作的工作示例。我找到了一些示例,但这些示例只返回 null 或 0。

我试过 X 和 UnHex() 都没有给我结果。

我哪里错了?

谢谢


编辑:

好的,在进行了更多测试之后,看来它首先必须是写入数据库的方式。

这是一个调用创建数据库条目的 SP 的经典 ASP 页面。在这种方法中,对数据库的写入工作,我可以在字段中看到 HEX 内容。复制该字段的内容,并将其放入 Select X'123123' 中,即可得到我想要的 ASCII 值。

如果我将其作为 Select 进行尝试,则会失败,返回零或 Null。

SELECT Message_Body_Hex, UNHEX(Message_Body_Hex) FROM messages_inbound

返回:

Message_Body_Hex......unhex(Message_Body_Hex)

417265612032........(空)

还是一头雾水!:)

4

2 回答 2

1

在 MySQL 5.5.29-1 上使用 UNHEX() 函数似乎可以正常工作:

mysql> create table t1 ( f1 varchar(1024) );
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t1 values('5468697320697320612074657374206D6573736167652031323334353637383930');
Query OK, 1 row affected (0.02 sec)

mysql> select f1 from t1; 
+--------------------------------------------------------------------+
| f1                                                                 |   
+--------------------------------------------------------------------+
| 5468697320697320612074657374206D6573736167652031323334353637383930 |
+--------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select unhex(f1) from t1; 
+-----------------------------------+
| unhex(f1)                         |   
+-----------------------------------+
| This is a test message 1234567890 |
+-----------------------------------+
1 row in set (0.00 sec)
于 2013-03-18T13:17:59.793 回答
1

我意识到这是一个老问题,但我今天遇到了同样的问题并使用 HEX 和 CAST 的组合解决了它。使用您的示例,试试这个:
SELECT HEX(CAST(X'5468697320697320612074657374206D6573736167652031323334353637383930' AS CHAR(33)))

从表中提取时,您将替换字段名称:

SELECT HEX(CAST(binary_field AS CHAR(33)))

我已经看到其他建议使用 MAX 代替 33 的答案,但这似乎工作正常。以下是我使用的一些资源:
SQL Server 将 varbinary 转换为字符串
以及
如何在 mysql 中从 varbinary 转换为 char/varchar

于 2015-12-13T13:48:13.737 回答