当 MySQL 添加一个与您自己同名的函数时会发生什么?

What happens when MySQL adds a function with the same name as your own?

我在 php (7.2) 中使用 sha3 哈希,我打算在 MySQL 中继续使用它们,但 MySQL 还不支持它们。

如果我编写自己的 UDF 并调用它,比方说,sha3,但随后某个 MySQL 版本添加了一个本机 sha3 函数,会发生什么情况?

无论如何我可能会给它起个别的名字以避免可能的冲突,但这最终可能会发生在任何函数中,所以我当然很好奇。


以防万一有人在 MySQL 中寻找 sha3 支持,我写了一个 MySQL UDF,它使用 rhash 来实现 完全 [=35] =]喜欢原生的sha2函数,可以在这里下载(安装和使用说明在评论里)https://gist.github.com/BrianLeishman/a0f40e7a0a87a7069c5c56a768ff3179

此外,值得注意的是 sha3 应该比 sha2 快(我认为),但我的函数比原生 sha2 慢 4 倍(当生成 100,000 个哈希值时),但希望未来的原生 sha3 能够解决这个问题问题。


我添加了一个单独的 UDF,用于返回不带十六进制编码的散列,称为 unhex_sha3,它实际上应该充当 unhex(sha3(...,这个版本几乎完全是本机速度(与 sha2), 因为我可以避免十六进制编码和反向编码之间毫无意义的转换。

https://gist.github.com/BrianLeishman/d7903a4acba75707c05fc581e1c714c3

来自function name resolution指南:

Avoid creating UDFs or stored functions that have the same name as a built-in function. ...

  • If you have already created a user-defined function with a given name and upgrade MySQL to a version that implements a new built-in function with the same name, the UDF becomes inaccessible. To correct this, use DROP FUNCTION to drop the UDF and CREATE FUNCTION to re-create the UDF with a different nonconflicting name. Then modify any affected code to use the new name.

  • If a new version of MySQL implements a built-in function with the same name as an existing stored function, you have two choices: Rename the stored function to use a nonconflicting name, or change calls to the function so that they use a schema qualifier (that is, use schema_name.func_name() syntax). In either case, modify any affected code accordingly.