Есть два способа исправить это:
Выполните в консоли MySQL следующее:
SET GLOBAL log_bin_trust_function_creators = 1;
Добавьте в файл конфигурации mysql.ini следующее:
log_bin_trust_function_creators = 1;
Этот параметр ослабляет проверку недетерминированных функций. Недетерминированные функции - это функции, которые изменяют данные (т. Е. Имеют операторы обновления, вставки или удаления). Для получения дополнительной информации см. Здесь .
Обратите внимание: если двоичное ведение журнала НЕ включено, этот параметр не применяется.
Бинарный журнал сохраненных программ
Если двоичное ведение журнала не включено, log_bin_trust_function_creators не применяется.
log_bin_trust_function_creators
Эта переменная применяется, когда включено двоичное ведение журнала.
Наилучший подход - лучшее понимание и использование детерминированных объявлений для хранимых функций. Эти объявления используются MySQL для оптимизации репликации, и рекомендуется тщательно выбирать их, чтобы репликация работала нормально.
ДЕТЕРМИНИСТИЧЕСКИЙ
Подпрограмма считается «детерминированной», если она всегда дает один и тот же результат для одних и тех же входных параметров, и НЕ ДЕТЕРМИНИСТИЧНАЯ в противном случае. Это в основном используется со строкой или математической обработкой, но не ограничивается этим.
НЕ ДЕТЕРМИНИСТИЧЕСКИЙ В
отличие от «ДЕТЕРМИНИСТИЧЕСКИЙ». « Если в определении подпрограммы не указано ни DETERMINISTIC, ни NOT DETERMINISTIC, по умолчанию используется значение NOT DETERMINISTIC. Чтобы объявить функцию детерминированной, вы должны явно указать DETERMINISTIC. ». Таким образом, похоже, что если не будет сделано никаких операторов, MySQl будет рассматривать функцию как «НЕ ДЕТЕРМИНИСТИЧЕСКУЮ». Это утверждение из руководства противоречит другому утверждению из другого раздела руководства, в котором говорится, что: "Когда вы создаете сохраненную функцию, вы должны объявить, что она детерминирована или не изменяет данные. В противном случае это может быть небезопасно для восстановления или репликации данных. По умолчанию, чтобы оператор CREATE FUNCTION был принят, необходимо явно указать хотя бы одно из DETERMINISTIC, NO SQL или READS SQL DATA. В противном случае возникает ошибка "
Я лично получал ошибку в MySQL 5.5, если не было объявления, поэтому я всегда помещаю по крайней мере одно объявление "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" или "READS SQL DATA" независимо от других объявлений, которые у меня могут быть.
ЧТЕНИЕ ДАННЫХ SQL
Это явно сообщает MySQL, что функция будет ТОЛЬКО считывать данные из баз данных, таким образом, она не содержит инструкций, которые изменяют данные, но она содержит инструкции SQL, которые читают данные (например, SELECT).
МОДИФИЦИРУЕТ ДАННЫЕ SQL.
Это указывает на то, что процедура содержит операторы, которые могут записывать данные (например, она содержит инструкции UPDATE, INSERT, DELETE или ALTER).
NO SQL
Это означает, что подпрограмма не содержит операторов SQL.
CONTAINS SQL
Это указывает на то, что процедура содержит инструкции SQL, но не содержит операторов, которые читают или записывают данные. Это значение по умолчанию, если ни одна из этих характеристик не указана явно. Примеры таких операторов: SELECT NOW (), SELECT 10 + @ b, SET @x = 1 или DO RELEASE_LOCK ('abc'), которые выполняются, но не читают и не записывают данные.
Обратите внимание, что есть функции MySQL, которые не являются детерминированно безопасными, например: NOW (), UUID () и т. Д., Которые могут давать разные результаты на разных машинах, поэтому пользовательская функция, содержащая такие инструкции, должна быть объявлена как НЕ ДЕТЕРМИНИСТИЧНАЯ. . Кроме того, функция, считывающая данные из нереплицированной схемы, явно НЕ ДЕТЕРМИНИСТИЧНА. *
Оценка природы подпрограммы основана на «честности» создателя: MySQL не проверяет, что подпрограмма, объявленная DETERMINISTIC, не содержит операторов, дающих недетерминированные результаты. Однако неправильное объявление процедуры может повлиять на результаты или повлиять на производительность. Объявление недетерминированной процедуры как DETERMINISTIC может привести к неожиданным результатам, заставив оптимизатор сделать неправильный выбор плана выполнения. Объявление детерминированной подпрограммы как NONDETERMINISTIC может снизить производительность, поскольку доступные оптимизации не будут использоваться.