powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / GROUP_CONCAT(CRC32(...)) SEPARATOR ''. Есть кузявка
8 сообщений из 8, страница 1 из 1
GROUP_CONCAT(CRC32(...)) SEPARATOR ''. Есть кузявка
    #39650800
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача такая. Необходимо получить GROUP_CONCAT от контрольных сумм CRC32 некоторых полей. Причём в составе GROUP_CONCAT каждая контрольная сумма должна быть представлена в бинарном виде (4 байта). Пишем запрос:
Код: plsql
1.
SELECT GROUP_CONCAT(CRC32(`table`.`field`) SEPARATOR '' AS CRC32 FROM `table`


В итоге получаем GROUP_CONCAT от строковых представлений чисел CRC32 (от 1 до 10 символов). В справке написано :
авторThe return value is a nonbinary or binary string, depending on whether the arguments are nonbinary or binary strings
Пробуем явно указать тип данных BINARY или BINARY(4), передаваемых функции GROUP_CONCAT:
Код: plsql
1.
SELECT GROUP_CONCAT(CAST(CRC32(`table`.`field`) AS BINARY(4)) SEPARATOR '' AS CRC32 FROM `table`

В итоге получаем GROUP_CONCAT от первых 4 символов строковых представлений CRC32. Отсюда делаем вывод: CRC32 возвращает строковое представление числа (от 1 до 10 символов). Где подвох ?

P.S . А получить-то нужно всего лишь последовательность байт (бинарную строку).
Для 10 полей должна быть получена бинарная строка из 40 байт (десять 4-байтовых целых чисел)
...
Рейтинг: 0 / 0
GROUP_CONCAT(CRC32(...)) SEPARATOR ''. Есть кузявка
    #39650801
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы предложил попробовать через HEX, примерно так:
Код: sql
1.
SELECT UNHEX(GROUP_CONCAT(SUBSTRING(HEX(4294967296+CRC32(`table`.`field`)),-8,8) SEPARATOR '')) AS CRC32 FROM `table`
...
Рейтинг: 0 / 0
GROUP_CONCAT(CRC32(...)) SEPARATOR ''. Есть кузявка
    #39651094
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторя бы предложил попробовать через HEX, примерно так:Да, такой вариант работает. На период выполнения проблемной функции GROUP_CONCAT преобразовываем байты в строку, а после GROUP_CONCAT - восстанавливаем.

Вместо SUBSTRING(HEX(4294967296+CRC32), -8, 8) можно использовать LPAD(HEX(CRC32)), 8, '0'):
Код: sql
1.
SELECT UNHEX(GROUP_CONCAT(LPAD(HEX(CRC32(`table`.`field`)), 8, '0') SEPARATOR '')) AS CRC32 FROM `table`
...
Рейтинг: 0 / 0
GROUP_CONCAT(CRC32(...)) SEPARATOR ''. Есть кузявка
    #39651405
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ итоге получаем GROUP_CONCAT от первых 4 символов строковых представлений CRC32...
На период выполнения проблемной функции GROUP_CONCAT...
Всё сводится к тому, что и GROUP_CONCAT(), и CAST() сначала приводят свой аргумент к строковому типу и только затем выполняют конкатенацию или приведение типа соответственно. Что касается конкатенации, то такое поведение противоречит справке...
...
Рейтинг: 0 / 0
GROUP_CONCAT(CRC32(...)) SEPARATOR ''. Есть кузявка
    #39651469
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Всё сводится к тому, что и GROUP_CONCAT(), и CAST() сначала приводят свой аргумент к строковому типу и только затем выполняют конкатенацию или приведение типа соответственно. Что касается конкатенации, то такое поведение противоречит справке...Не очень понял касательно GROUP_CONCAT(), а как еще может быть? Конкатенация - это соединение нескольких строк в одну. Конечно же, нужно сперва преобразовать данные произвольных типов к строковому типу. И противоречия справке я не нашел. Можете точное место указать?
...
Рейтинг: 0 / 0
GROUP_CONCAT(CRC32(...)) SEPARATOR ''. Есть кузявка
    #39651470
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У GROUP_CONCAT() в доке есть отсылка к CONCAT(), а у того уже написано:
https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_concat A numeric argument is converted to its equivalent nonbinary string form.
...
Рейтинг: 0 / 0
GROUP_CONCAT(CRC32(...)) SEPARATOR ''. Есть кузявка
    #39651543
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторThe return value is a nonbinary or binary string, depending on whether the arguments are nonbinary or binary strings
If all arguments are nonbinary strings, the result is a nonbinary string. If the arguments include any binary strings, the result is a binary string
A numeric argument is converted to its equivalent nonbinary string form.
Понимается так, что если числа, то получим конкатенацию строковых представлений. Если бинарные строки - бинарную/байтовую конкатенацию (то что нужно). Только вот CAST числа (CRC32) к бинарным строкам как-то ненормально приводит. Предварительно получает строковое представление числа и только затем приводит к бинарной строке...
...
Рейтинг: 0 / 0
GROUP_CONCAT(CRC32(...)) SEPARATOR ''. Есть кузявка
    #39651553
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,

Не бинарную конкатенацию, а конкатенации бинарных строк.
Бинарные строки - это обычные строки с тем исключением, что к ним не применяются операции преобразования кодировки при передаче и хранении.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / GROUP_CONCAT(CRC32(...)) SEPARATOR ''. Есть кузявка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]