Как вывести представление типа данных MySQL в двоичном виде?
Пробовал так:
select cast(convert('1900-01-02 00:00:01.000000', datetime(6)) AS BINARY)
Получил такое:
4957484845484945485032484858484858484946484848484848
Это просто коды символов по ASCII, но datetime(6) занимает 8 байт и мне нужно именно содержимое этих 8 байт. convert вместо cast не помог. Интересует именно datetime(6). Такой подход работал для MS SQL Server, но для MySQL почему-то поведение отличается.
Ответы (2 шт):
Получилось открыть .idb файл HEX-редактором и найти там нужные 8 байт.
В даблице была запись: '2020-05-05 23:18:36.123457', для которой первые 5 байт по официальной документации закодированы как 99A64B74A4. Оставшиеся три байта были найдены в HEX-представлении файла таблицы и оказались 01E241, т.е. первые 4 бита - дырка, фактически, лидирующие нули.
Исходя из документации должно быть 5+3 байта
получается что нужно сделать так:
select
d as datetime
, UNIX_TIMESTAMP(d) as timestamp
, TRUNCATE(UNIX_TIMESTAMP(d)*1000000, 0) as ULong
, HEX(UNIX_TIMESTAMP(d)*1000000) as `hex(ULong)`
FROM (
SELECT '2020-05-05 23:18:36.123457' AS d UNION
SELECT '2020-05-05 23:18:36.123458' AS d UNION
SELECT '2015-01-15 12:01:01' AS d UNION
SELECT '2015-01-15 12:01:01.001' AS d UNION
SELECT '2015-01-15 12:01:01.000001' AS d
) v
'2020-05-05 23:18:36.123457' > 5A4EC5A33A141
'2020-05-05 23:18:36.123458' > 5A4EC5A33A142