当 MySQL 添加一个与你自己同名的函数时会发生啥?

Posted

技术标签:

【中文标题】当 MySQL 添加一个与你自己同名的函数时会发生啥?【英文标题】:What happens when MySQL adds a function with the same name as your own?当 MySQL 添加一个与你自己同名的函数时会发生什么? 【发布时间】:2018-08-03 21:55:17 【问题描述】:

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

如果我编写自己的 UDF 并将其命名为 sha3,但未来的某个 MySQL 版本添加了本机 sha3 函数,会发生什么?

为了避免可能的冲突,我可能会为它命名其他名称,但这最终可能发生在任何函数上,所以我当然很好奇。


以防万一有人在 MySQL 中寻找 sha3 支持,我编写了一个 MySQL UDF,它使用 rhash 来实现这一点(安装和使用说明在cmets中)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

【问题讨论】:

【参考方案1】:

来自function name resolution指南:

避免创建与内置函数同名的 UDF 或存储函数。 ...

如果您已经创建了具有给定名称的用户定义函数并将 MySQL 升级到实现具有相同名称的新内置函数的版本,则 UDF 将无法访问。要更正此问题,请使用 DROP FUNCTION 删除 UDF 并使用 CREATE FUNCTION 重新创建具有不同非冲突名称的 UDF。然后修改任何受影响的代码以使用新名称。

如果新版本的 MySQL 实现了与现有存储函数同名的内置函数,您有两种选择:重命名存储函数以使用不冲突的名称,或更改对函数的调用以便它们使用模式限定符(即使用 schema_name.func_name() 语法)。在任何一种情况下,相应地修改任何受影响的代码。

【讨论】:

嗯,这很快,我当然尝试用谷歌搜索,但我的措辞失败了......谢谢!当它允许我时,我会标记为答案:) 实际上,在我的确切用例中,这是非常理想的行为,因为我可以使用与 sha2 相同的参数顺序将其命名为 sha3,并且当更新到来时,将使用本机函数代替 我已将我的 UDF 添加到我的答案中 :)

以上是关于当 MySQL 添加一个与你自己同名的函数时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

当一个类符合一个包含变异函数的协议时会发生啥?

mmap local v/s nfs file:当底层文件在磁盘上被替换时会发生啥?

当返回对象的函数在没有返回语句的情况下结束时会发生啥

当删除没有虚拟析构函数的多态对象时会发生啥?

C alloca 函数 - 当试图分配太多内存时会发生啥

当调用winsock 中的recv 函数并且没有收到所有数据时会发生啥?