MySQL - 如何取消字段而不是字符串?

时间:2013-03-18 13:02:10

标签: mysql hex

我有一个包含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)

仍然困惑! :)

2 个答案:

答案 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