Что происходит, когда MySQL добавляет функцию с тем же именем, что и у вас?
Я использую хэши sha3 в php (7.2), и я собирался продолжать использовать их в MySQL, но MySQL пока не поддерживает их.
Если я напишу свой UDF и позвоню, скажем, sha3
, но потом какая-то будущая версия MySQL добавляет нативную sha3
функция, что происходит?
Я, вероятно, в любом случае назову это как-то иначе, чтобы избежать возможного конфликта, но в конечном итоге это может произойти с любой функцией, поэтому мне, безусловно, любопытно.
На всякий случай, если кто-то ищет поддержку sha3 в MySQL, я написал MySQL UDF, которая делает именно это, используя rhash, который намеревается функционировать точно так же, как встроенная функция sha2, которую вы можете скачать здесь (инструкции по установке и использованию находятся в комментариях) https://gist.github.com/BrianLeishman/a0f40e7a0a87a7069c5c56a768ff3179
Кроме того, стоит отметить, что sha3 должен быть быстрее, чем sha2 (я думаю), но моя функция в 4 раза медленнее, чем собственная sha2 (при генерации 100 000 хешей), но, надеюсь, будущая собственная sha3 решит эту проблему.
Я добавил отдельный UDF для возврата хэшей без шестнадцатеричной кодировки unhex_sha3
который должен буквально действовать как unhex(sha3(...
и эта версия почти точно родная скорость (по сравнению с sha2
), поскольку я могу избежать бессмысленного перевода между шестнадцатеричным кодированием и обратно.
https://gist.github.com/BrianLeishman/d7903a4acba75707c05fc581e1c714c3
1 ответ
Из директивы разрешения имени функции:
Избегайте создания пользовательских функций или хранимых функций, которые имеют то же имя, что и встроенная функция....
Если вы уже создали пользовательскую функцию с заданным именем и обновили MySQL до версии, которая реализует новую встроенную функцию с тем же именем, UDF становится недоступным. Чтобы исправить это, используйте DROP FUNCTION, чтобы удалить UDF, и CREATE FUNCTION, чтобы воссоздать UDF с другим неконфликтующим именем. Затем измените любой затронутый код, чтобы использовать новое имя.
Если в новой версии MySQL реализована встроенная функция с тем же именем, что и у существующей хранимой функции, у вас есть два варианта: переименовать хранимую функцию, чтобы использовать неконфликтующее имя, или изменить вызовы функции, чтобы они использовали спецификатор схемы (то есть используйте синтаксис schema_name.func_name()). В любом случае измените любой уязвимый код соответствующим образом.