如何在mysql查询中找到byte[]?

Fla*_*nix 2 java mysql search byte blob

我有一个不错的 MySQL 表,如下所示:

CREATE TABLE IF NOT EXISTS BLOBTest(Id INT PRIMARY KEY AUTO_INCREMENT,

    Data BLOB);
Run Code Online (Sandbox Code Playgroud)

在里面我有以下内容:

SELECT HEX(Data) from BLOBTest;

+----------------------------------+
| HEX(Data)                        |
+----------------------------------+
| E764DF04463B55E9E2305934266227A1 |
+----------------------------------+
Run Code Online (Sandbox Code Playgroud)

翻译后,我有一个包含 1 行和 2 列(Id 和 Data)的表。这一行存放的是byte[]数据,存放的byte[]数组如下:[-25, 100, -33, 4, 70, 59, 85, -23, -30, 48, 89, 52, 38, 98 , 39, -95]

如何进行查询以获取整个方法?起初我试过:

SELECT * FROM BLOBTest WHERE Data='[-25, 100, -33, 4, 70, 59, 85, -23, -30, 48, 89, 52, 38, 98, 39, -95]';
Run Code Online (Sandbox Code Playgroud)

然而这种方法根本不起作用,它总是返回一个空集。我需要获取该行的所有信息,而我所拥有的只是 byte[] 值。我该怎么做?

如果可能,感谢您的任何帮助。

编辑:

这是java应用程序的代码及其功能。

public Map<Integer, String> queryAuthor(String author) throws Exception{

    //encrypts the name of the author
    byte[] cipheredName = cryptManager.encrypt(keyBytes, 
                author.getBytes());

    //queries db for encrypted name
    pst = con.prepareStatement("SELECT * FROM BLOBTest WHERE DATA='" + cipheredName+"'");

    //builds a map for clients to use with the information from the query. 
    ResultSet rs =  pst.executeQuery();
    Map<Integer, String> result = new HashMap<Integer, String>();
    while (rs.next()) {

        byte[] recoveredBytes = rs.getBytes(2);

        byte[] recoveredName = cryptManager.decrypt(keyBytes, 
                    recoveredBytes);

        result.put(rs.getInt(1), new String(recoveredName));

    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

问题在于制作:

SELECT * FROM BLOBTest WHERE Data='[-25, 100, -33, 4, 70, 59, 85, -23, -30, 48, 89, 52, 38, 98, 39, -95]';
Run Code Online (Sandbox Code Playgroud)

返回一个空集,从而使变量“rs”为空,因此返回的映射为空。每个人都很难过,因为我是菜鸟,无法进行这样的简单查询 =(

egg*_*yal 5

您可以将原始字节作为字符串文字发送到 MySQL:

SELECT * FROM BLOBTest WHERE Data = '????????????????'
Run Code Online (Sandbox Code Playgroud)

(由于并非所有字节都可以用可打印字符表示,我什至没有尝试过)。

如果您通过参数将数据传递给准备好的语句(在任何情况下您确实应该这样做),这将特别容易做到:

pst = con.prepareStatement("SELECT * FROM BLOBTest WHERE DATA = ?");
pst.setBytes(1, cipheredName);
Run Code Online (Sandbox Code Playgroud)

否则,您必须小心确保将 MySQL 解析为字符串终止引号的任何字节转义,否则它们会破坏您的查询。


(以下内容早于 OP 编辑​​中提供的附加信息)

如果这是不可能的,它可能表明您不应该将数据存储在BLOB-type 列中;例如,16TINYINT SIGNED列可能更合适。

即便如此,仍有可能:

sqlfiddle查看

sqlfiddle查看

  • 否则,您将需要去除最高位,因为 MySQL 将每个输入CHAR()视为 4 字节整数:

      SELECT * FROM BLOBTest WHERE Data = CHAR(
        -25 & 0xff,
        100 & 0xff,
        -33 & 0xff,
          4 & 0xff,
         70 & 0xff,
         59 & 0xff,
         85 & 0xff,
        -23 & 0xff,
        -30 & 0xff,
         48 & 0xff,
         89 & 0xff,
         52 & 0xff,
         38 & 0xff,
         98 & 0xff,
         39 & 0xff,
        -95 & 0xff
      )
    
    Run Code Online (Sandbox Code Playgroud)

sqlfiddle查看