У меня есть сервер Percona Mysql и клиент Java с пользовательским ORM.В БД у меня есть таблица:
CREATE TABLE `PlayerSecret` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`created` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`secret` binary(16) NOT NULL,
`player_id` bigint(20) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `PlayerSecret_secret_unique` (`secret`),
KEY `PlayerSecret_player_id` (`player_id`)
) ENGINE=InnoDB AUTO_INCREMENT=141 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
Я обнаружил, что запрос SELECT PlayerSecret.player_id FROM PlayerSecret WHERE PlayerSecret.secret = ?
возвращает пустой набор результатов, когда параметр предоставлен методом java.sql.PreparedStatement#setBytes
, и работает, как и ожидалось, java.sql.PreparedStatement#setBinaryStream
.Я включил общий журнал mysql и обнаружил, что в этом журнале оба запроса одинаковы, я проверил это в шестнадцатеричном режиме.
В общем журнале это выглядит так:
SELECT PlayerSecret.player_id FROM PlayerSecret WHERE PlayerSecret.secret = '<96>R\Ø8üõA\í¤Z´^E\Ô\ÊÁ\Ö'
Параметр запроса из общего журнала в шестнадцатеричном режиме: 2796 525c d838 fcf5 415c eda4 5ab4 055c d45c cac1 5cd6 27
Значение в базе данных:
mysql> select hex(secret) from PlayerSecret where id=109;
+----------------------------------+
| hex(secret) |
+----------------------------------+
| 9652D838FCF541EDA45AB405D4CAC1D6 |
+----------------------------------+
1 row in set (0.00 sec)
Проблема в том, что мой ORM выполняет этот запрос, хотя setBytes
метод, я думаю, что это правильный путь для BINARY
типа данных, но он не работает.
Часть my.cnf
снастройки кодирования (возможно, это важно):
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
general_log = on
general_log_file=/var/log/mysql/mysqld_general.log
require_secure_transport = ON
init-connect = SET collation_connection = utf8mb4_unicode_ci
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
Java-код:
var uuid = UUID.fromString("9652d838-fcf5-41ed-a45a-b405d4cac1d6");
var array = ByteBuffer.allocate(16).putLong(uuid.getMostSignificantBits()).putLong(uuid.getLeastSignificantBits()).array();
// works
stmt.setBinaryStream(index, new ByteArrayInputStream(array));
// don't works
stmt.setBytes(index, array);
Я не могу понять, в чем разница между обоими случаями и как это исправить для setBytes
вариант.Может быть, кто-то может прояснить это или указать мне важные части / места?
Мой env:
- Openjdk 11
- HicariCP 3.1.0
- MySQL, Connector / J 8.0.13
- Percona 5.7.24-26-log Percona Server (GPL), выпуск «26», редакция «c8fe767»