前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL8——带有字符集的UDF

MySQL8——带有字符集的UDF

作者头像
MySQLSE
发布2020-09-28 15:14:54
1.6K0
发布2020-09-28 15:14:54
举报
文章被收录于专栏:MySQL解决方案工程师

作者:Rahul Sisondia 译:徐轶韬

如果您点开这篇文章,估计您已经知道MySQL中用户定义函数(UDF)的用途。如果您需要快速了解UDF,请参阅MySQL参考手册“https://dev.mysql.com/doc/refman/8.0/en/adding-udf.html”。如果您创建过自己的UDF,是否曾经遇到过与UDF相关的字符集问题?如果遇到过,这篇文章将会提供一些帮助,如果您打算编写新的UDF,最好也阅读一下这篇文章。MySQL UDF框架在最初设计时,没有考虑字符串参数和返回值的字符集。这意味着UDF的参数和返回值将会使用“二进制”字符集。即使用户定义了字符集,服务器返回的字符串,也会忽略该字符集。现在,我们已经向UDF框架添加了字符集功能,用户可以读取或设置UDF参数的字符集,还可以根据需要转换返回值的字符集。

让我们通过一个例子来理解。为了简单起见,让我们假设用户有下表,该表有两列。一列具有字符集“ utf8mb4”,另一列具有字符集“ latin1”。该表有一个记录。每列中存储的字符串相同。当然,根据它们各自的字符集,两个字符串的编码是不同的。我们可以通过检查列的十六进制和字符集来验证这一点。

在这里和其它地方,可以会考虑使用\ G输出“纵向”结果集,以使查询输出更易于阅读。

现在,假设实现了以下带有两个字符串参数的UDF,并且返回了将两个参数连接在一起的字符串。为了简单起见,这里没有添加检查以确认有效性和其他错误情况。

前面的UDF适用于ASCII字符。如果将两个字符串传递给不同的字符集,将会发生什么情况?

当我们通过UDF连接两列时,它只是连接了以各自的字符集表示的两个字符串。返回值的字符集为“ binary”,因此返回值没有意义,如下所示。

在MySQL 8.0.19中,我们添加了组件服务'mysql_udf_metadata',以检测输入参数的字符集,并选择UDF输出的所需字符集。让我们使用新的组件服务来实现一下。现在,UDF希望使用latin1字符集中的两个参数,并返回utf8mb4字符集的连接字符串。这是先前UDF的修改版本。

让我们在与之前相同的表上再次执行UDF。请注意,我们以utf8mb4编码传递了第一个参数,并以latin1传递了第二个参数。UDF能够处理两个参数的字符集。它将连接的字符串作为格式正确的“ utf8mb4”编码的字符串返回。

在前面显示的convert()方法中,现有的“ mysql_string_converter”组件服务将字符串从字符集(latin1)转换为另一个字符集(utf8mb4)。 此方法是可选项。仅当我们希望返回值是不同于参数字符集时才需要。相反,如果我们希望返回值与示例中的参数使用相同的字符集(即latin1),则可以轻松实现:在add_strings_init()方法中设置所需的参数字符集和返回值,然后像往常一样在add_strings()方法中附加字符串。

如您所见,创建支持字符集的UDF变得非常容易。用户可以轻松升级现有的UDF。

请参考以下通过组件和插件实现UDF的源目录。

请参考以下MTR测试,以测试上述组件和插件。

如果需要有关UDF参数和返回值中处理字符集的更多详细信息,请参考WL#12370。我们希望该功能对您有所帮助。尝试一下,并让我们聆听您的反馈。

感谢您使用MySQL!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MySQL解决方案工程师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档