Navicat 博客

MySQL 8 中的数据类型转换 2021 年 7 月 9 日,由 Robert Gravelle 撰写

任何时候将数据分类为不同类型时,都不可避免地需要从一种数据类型转换为另一种数据类型。在我的脑海中,一个常见的使用示例是处理通过查询参数或 POST 请求正文从 Web 表单传入的变量。序列化数据以便通过网络发送它倾向于将所有变量强制转换为字符串。因此,它们通常需要转换为更合适的数据类型,例如数字、日期或你有的数据类型。

在关系数据库中,将一种数据类型转换为另一种数据类型的原因包括将数据从一种数据库类型移植到另一种数据库类型、更改列的数据类型或在数据类型之间临时切换以进行计算。在 MySQL 中,我们可以使用 CAST() 和 CONVERT() 函数在数据类型之间进行转换。在今天的文章中,我们将学习如何使用这两个函数,并通过示例来说明它们的用法。

有什么不同?

CAST() 和 CONVERT() 都可以更改 MySQL 中的数据类型。由于两者非常相似,许多 SQL 新手(以及一些更有经验的用户!)想知道有什么区别。主要区别在于 CONVERT() 还可以将数据的字符集转换为另一个字符集。CAST() 就不能用于更改字符集。因此,除非你需要转换字符集,CAST() 应该是你的 goto 转换函数。

CAST() 函数

MySQL CAST() 接受两个输入:

  • 要类型转换的数据
  • 你希望将此数据转换为的数据类型(十进制、字符等)。你可以将数据转换为 BINARY、CHAR、DATE、DATETIME、TIME、DECIMAL、SIGNED、UNSIGNED 数据类型。

H这是语法:

CAST(data as data_type)

一个近乎真实的例子

CAST() 函数的一个有用应用是使非常大的数据类型不那么笨拙(更实用?)。以下查询返回有关 MySQL Sakila 示例数据库中特定电影的信息。它的其中一列 description 是一个文本字段。这意味着它可以存储大量文本! 我们可以使用 CAST() 将描述截断为 100 个字符,这样我们就不会得到关于电影的整本书:

cast_example (60K)

说到 Sakila 示例数据库,你知道它以 MySQL 的海豚吉祥物命名吗?它是从用户在“Name the Dolphin”比赛中建议的大量名称中选出的。获奖名称由来自非洲 Eswatini(前 Swaziland)的开源软件开发人员 Ambrose Twebaze 提交。

CONVERT() 函数

CONVERT() 函数的语法与 CAST() 类似,但表达式和结果类型的格式稍微不同。一种方式是提供两个单独的参数:

CONVERT(expr, data_type)

除此之外,data_type 参数可以是 CAST() 函数支持的任何相同类型。

一个不太真实的例子

由于 CAST() 和 CONVERT() 之间的主要区别在于后者可以将列的字符集转换为不同的字符集,让我们实际演示一下。

首先要注意的是,转换字符集的语法略有不同。在这种情况下,我们需要在表达式和字符集之间添加 USING 关键字:

CONVERT(expr USING charset);

Navicat for MySQL(或 Navicat Premium)中,我们可以在信息窗格中看到表的字符集和排序规则:

film_table_info (34K)

考虑到这一点,我们可以将 CONVERT() 函数应用于前面的查询,将 description 字段从 UTF-8 转换为 Latin1。如果你好奇的话,两者的区别在于,在 latin1 中,每个字符正好是一个字节长,而在 utf8 中,一个字符可以由多个字节组成。因此 utf8 比 latin1 有更多的字符。此外,它们共有的字符不一定由相同的字节或字节序列表示。

总结

在今天的文章中,我们看到了如何使用 CAST() 将数据转换为不同的类型,以及如何使用 CONVERT() 在字符集之间进行转换。重申一下,CAST() 应该是你的 goto 转换函数。而 CONVERT() 更适合在字符集之间切换。

如果你对 Navicat for MySQL 感兴趣,可以免费试用 14 天!



Rob Gravelle 居住在加拿大渥太华,是一名有 20 多年经验的 IT 专家。过往,Rob 曾为与情报有关的组织(如加拿大边境服务局和各种商业组织)构建系统。在业余时间,Rob 是一名出色的吉他演奏家,他拥有多张 CD 和数字发行版

Navicat 文章
频道条目
分享
文章归档