MySQL中CAST和CONVERT函数都用于数据类型转换

2024-06-16 23:44

本文主要是介绍MySQL中CAST和CONVERT函数都用于数据类型转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在 MySQL 中,CAST()CONVERT() 函数都用于数据类型转换。虽然这两个函数在大多数情况下可以互换使用,但它们之间还是有一些细微的差别。

官方文档地址

https://dev.mysql.com/doc/refman/8.4/en/cast-functions.html#function_cast

CAST() 函数

CAST() 函数是 SQL 标准中的数据类型转换函数。其基本语法如下:

CAST(expression AS type)CAST(timestamp_value AT TIME ZONE timezone_specifier AS DATETIME[(precision)])timezone_specifier: [INTERVAL] '+00:00' | 'UTC'
  • expression 是要转换的值或表达式。
  • type 是要转换为的数据类型。

例如,将整数转换为字符串:

(root@localhost:mysql.sock)[(superdb)]>SELECT CAST(8860 AS CHAR) as v1;
+------+
| v1   |
+------+
| 8860 |
+------+
1 row in set (0.00 sec)

强制转换函数对于在CREATE TABLE中创建具有特定类型的列很有用。。。SELECT语句
The cast functions are useful for creating a column with a specific type in a CREATE TABLE … SELECT statement

(root@localhost:mysql.sock)[superdb]>CREATE TABLE t_new_table SELECT CAST('2024001' AS decimal(18,0)) as id,CAST('2000-01-01' AS DATE) AS col_1;
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0(root@localhost:mysql.sock)[superdb]>show create table t_new_table;
+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table       | Create Table                                                                                                                                                           |
+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_new_table | CREATE TABLE `t_new_table` (`id` decimal(18,0) NOT NULL DEFAULT '0',`col_1` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)(root@localhost:mysql.sock)[superdb]>desc t_new_table;
+-------+---------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| id    | decimal(18,0) | NO   |     | 0       |       |
| col_1 | date          | YES  |     | NULL    |       |
+-------+---------------+------+-----+---------+-------+
2 rows in set (0.00 sec)(root@localhost:mysql.sock)[superdb]>select * from t_new_table;
+---------+------------+
| id      | col_1      |
+---------+------------+
| 2024001 | 2000-01-01 |
+---------+------------+
1 row in set (0.00 sec)

强制转换为有符号或无符号的64位整数

use the SIGNED or UNSIGNED cast operator to cast a value to a signed or unsigned 64-bit integer

(root@localhost:mysql.sock)[superdb]>SELECT 8-9 as v1,CAST(8 - 9 AS SIGNED) as v2, CAST(8 - 9 AS UNSIGNED) as v3;
+----+----+----------------------+
| v1 | v2 | v3                   |
+----+----+----------------------+
| -1 | -1 | 18446744073709551615 |
+----+----+----------------------+
1 row in set (0.00 sec)

从MySQL 8.0.22开始,CAST()支持使用AT TIMEZONE运算符检索以UTC为单位的TIMESTAMP值。唯一支持的时区是UTC;这可以指定为“+000:00”或“UTC”。此语法支持的唯一返回类型是DATETIME,其可选精度说明符范围为0到6(包括0到6)

Beginning with MySQL 8.0.22, CAST() supports retrieval of a TIMESTAMP value as being in UTC, using the AT TIMEZONE operator. The only supported time zone is UTC; this can be specified as either of '+00:00' or 'UTC'. The only return type supported by this syntax is DATETIME, with an optional precision specifier in the range of 0 to 6, inclusive.

TIMESTAMP values that use timezone offsets are also supported.


(root@localhost:mysql.sock)[superdb]> SELECT @@system_time_zone;
+--------------------+
| @@system_time_zone |
+--------------------+
| CST                |
+--------------------+
1 row in set (0.00 sec)(root@localhost:mysql.sock)[superdb]> CREATE TABLE t_cast_timezone (col_convert_datetime TIMESTAMP);
Query OK, 0 rows affected (0.06 sec)(root@localhost:mysql.sock)[superdb]> INSERT INTO t_cast_timezone VALUES ROW(CURRENT_TIMESTAMP),ROW('2024-06-15 14:50:15');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0(root@192.168.80.85)[superdb]> TABLE t_cast_timezone;
+----------------------+
| col_convert_datetime |
+----------------------+
| 2024-06-15 22:06:07  |
| 2024-06-15 14:50:15  |
+----------------------+
2 rows in set (0.00 sec)(root@localhost:mysql.sock)[superdb]> SELECT CAST(col_convert_datetime AT TIME ZONE '+00:00' AS DATETIME) AS u FROM t_cast_timezone;
+---------------------+
| u                   |
+---------------------+
| 2024-06-15 14:06:07 |
| 2024-06-15 06:50:15 |
+---------------------+
2 rows in set (0.00 sec)

CONVERT() 函数

CONVERT() 函数在某些数据库系统(如 MySQL)中提供,但在其他系统中可能不可用。其基本语法如下:

CONVERT(expression, type)

或(在某些数据库系统中)

CONVERT(type, expression)

但请注意,在 MySQL 中,CONVERT() 函数的语法与 CAST() 类似:

CONVERT(expression, type)
  • expression 是要转换的值或表达式。
  • type 是要转换为的数据类型。

例如,在 MySQL 中,将整数转换为字符串与 CAST() 函数的示例相同:

(root@localhost:mysql.sock)[superdb]>SELECT CONVERT(123890,CHAR) as v1;
+--------+
| v1     |
+--------+
| 123890 |
+--------+
1 row in set (0.01 sec)

例如,在 MySQL 中,将整数转换为双精度decimal类型的示例

decimal 类型可以存储大量的数字,并且具有可配置的精度。例如,decimal(18,2) 可以存储最多 18 位数字,其中 2 位在小数点之后

(root@localhost:mysql.sock)[superdb]>SELECT CONVERT(123890,decimal(18,2)) as v1;
+-----------+
| v1        |
+-----------+
| 123890.00 |
+-----------+
1 row in set (0.00 sec)-- 将字符串转换为双精度decimal类型的示例(root@localhost:mysql.sock)[superdb]>SELECT CONVERT(123890,decimal(18,2)) as v1,CONVERT('123890',decimal(18,2)) as v2;
+-----------+-----------+
| v1        | v2        |
+-----------+-----------+
| 123890.00 | 123890.00 |
+-----------+-----------+
1 row in set (0.00 sec)

将日期字符串转换为日期类型

(root@localhost:mysql.sock)[superdb]>SELECT CONVERT('2024-06-13', DATE) as v1,CONVERT('2024-06-13 13:16:24', DATETIME) as v2;
+------------+---------------------+
| v1         | v2                  |
+------------+---------------------+
| 2024-06-13 | 2024-06-13 13:16:24 |
+------------+---------------------+
1 row in set (0.00 sec)

字符集转换在二进制字符串的字母大小写转换之前也很有用。LOWER()和UPPER()在直接应用于二进制字符串时是无效的,因为lettercase的概念不适用。

Character set conversion is also useful preceding lettercase conversion of binary strings. LOWER() and UPPER() are ineffective when applied directly to binary strings because the concept of lettercase does not apply. To perform lettercase conversion of a binary string, first convert it to a nonbinary string using a character set appropriate for the data stored in the string

(root@localhost:mysql.sock)[superdb]>SET @str = BINARY 'New York';
Query OK, 0 rows affected, 1 warning (0.00 sec)(root@localhost:mysql.sock)[superdb]>SELECT LOWER(@str), LOWER(CONVERT(@str USING utf8mb4));
+--------------------------+------------------------------------+
| LOWER(@str)              | LOWER(CONVERT(@str USING utf8mb4)) |
+--------------------------+------------------------------------+
| 0x4E657720596F726B       | new york                           |
+--------------------------+------------------------------------+
1 row in set (0.00 sec)

使用 CONVERT() 进行字符集转换(注意:在某些数据库系统中,CONVERT() 可能不支持字符集转换,但MySQL的 CONVERT() 函数在 USING 子句的支持下可以这样做)

两者之间的差别

  1. SQL 标准CAST() 是 SQL 标准中的函数,而 CONVERT() 并非所有数据库系统都支持。
  2. 语法:虽然在 MySQL 中 CONVERT() 的语法与 CAST() 类似,但在其他数据库中可能有所不同。
  3. 功能:在某些数据库中,CONVERT() 可能提供额外的功能或选项,这些功能在 CAST() 中不可用。但在 MySQL 中,这两个函数在功能上非常相似。
  4. 可读性:有时,CONVERT() 可能会被认为更具可读性,因为它更接近于许多编程语言中的类型转换语法。但是,由于 CAST() 是 SQL 标准中的函数,因此它通常更受推荐。

总结

在 MySQL 中,CAST()CONVERT() 都可以用于数据类型转换,并且它们在功能上非常相似。然而,由于 CAST() 是 SQL 标准中的函数,因此通常更推荐使用它。但在其他数据库系统中,您可能需要检查这两个函数的可用性和功能差异。

这篇关于MySQL中CAST和CONVERT函数都用于数据类型转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067886

相关文章

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

MySQL 多表连接操作方法(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN)

《MySQL多表连接操作方法(INNERJOIN、LEFTJOIN、RIGHTJOIN、FULLOUTERJOIN)》多表连接是一种将两个或多个表中的数据组合在一起的SQL操作,通过连接,... 目录一、 什么是多表连接?二、 mysql 支持的连接类型三、 多表连接的语法四、实战示例 数据准备五、连接的性

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读