我有一个包含varchar(1024)字段的表,其中包含具有十六进制编码字符串的字符串。这个表是自动填充的,我必须提供一个允许用户下载的SP,因此,我需要将十六进制更改为人类可读的形式。
如果我手动运行此语句(从字段中获取十六进制数据),它可以正常工作:
SELECT X'5468697320697320612074657374206D6573736167652031323334353637383930';
但是我找不到一个在调用字段/列名时让它工作的工作示例。我找到了一些例子,但这些只返回null或0。
我尝试过X和UnHex()并且都没有给我一个结果。
我哪里错了?
由于
编辑:
好的,经过多一点测试后,看来它必须是首先写入数据库的方式。
这是一个经典的ASP页面,它调用SP来创建数据库条目。在这种方法中,对DB的写入工作,我可以在字段中看到HEX内容。复制字段的内容,并将其放入Select X'123123',可以根据需要为我提供ASCII值。
如果我尝试选择此选项,则会失败,给我一个零或空返回。
SELECT Message_Body_Hex, UNHEX(Message_Body_Hex) FROM messages_inbound
返回:
Message_Body_Hex ...... UNHEX(Message_Body_Hex)
417265612032 ........(NULL)
仍然困惑! :)
答案 0 :(得分:1)
使用UNHEX()函数似乎在MySQL 5.5.29-1上运行良好:
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)
答案 1 :(得分:1)
我意识到这是一个老问题,但我今天遇到了同样的问题并使用HEX和CAST的组合解决了它。使用您的示例,试试这个:
SELECT HEX(CAST(X'5468697320697320612074657374206D6573736167652031323334353637383930' AS CHAR(33)))
从表中拉出时,您将替换字段名称:
SELECT HEX(CAST(binary_field AS CHAR(33)))
我已经看到其他答案建议使用MAX代替33但这似乎工作正常。以下是我使用的一些来源:
SQL Server converting varbinary to string
和
How to convert from varbinary to char/varchar in mysql