MySQL CAST()和CONVERT()的区别
0.有区别吗
cast()
和convert()
都是类型转换函数,可以将某个数据类型的值转换为另一种数据类型。
其实在大部分情况下,这两个函数都是没有区别的。MySQL
官方文档中对于cast()
也提到:
This operation may also be expressed as CONVERT(expr, type), which is equivalent.
意思是:cast()
的此操作(类型转换)可以被convert()
替换,他们是等价的。
那么它们两个真的就没有区别吗?如果没有区别,为什么要设计两个功能一样的函数呢?带着这样的疑问,我认真地阅读了一下官方文档,对此总结如下:
他 们 真 的 没 有 区 别。
1.没有区别
没错,这就是事实。cast()
能做的convert()
也能做,反之亦然。有的文章说convert()
支持编码转换,可是我cast()
也支持啊:
CONVERT(string, CHAR[(N)] CHARACTER SET charset_name)
CAST(string AS CHAR[(N)] CHARACTER SET charset_name)
有的文章说,cast()
可用于在CREATE TABLE ... SELECT
语句中创建具有特定类型的列 ,可是我convert()
也可以啊:
CREATE TABLE new_table1 SELECT CAST('2000-01-01' AS DATE) AS c1;
CREATE TABLE new_table2 SELECT CONVERT('2000-01-01', DATE) AS c1;
这两条语句创建的表结构是一模一样的。
从功能上说,cast()
和convert()
就跟双胞胎一样,没有任何区别。
2.还是有一点的咯
硬要鸡蛋里挑骨头说区别的话,那就是以下两点吧:
- 语法不同:
功能 | cast() | convert() |
---|---|---|
类型转换 | cast(expr AS type) | convert(expr, type) |
编码转换 | cast(string AS CHAR[(N)] CHARACTER SET charset_name) | convert(expr USING transcoding_name) 或 convert(string, CHAR[(N)] CHARACTER SET charset_name |
- 标准不同。
cast()
是ANSI标准语法,convert()
不是:
这个怎么说呢,使用ANSI标准语法可以有更好的移植性,但是对于SQL
的性能方面基本没有影响。一个常见的误区是很多人认为count(1)
比count(*)
效率高,其实不是。count(*)
是ANSI标准语法而count(1)
不是,而他们实现的功能以及性能是一致的,没有任何区别。
3.结语
综上所述,在日常使用中,就不要再纠结用cast()
还是convert()
了,随便选一个就行,选不出来就丢硬币吧(不是)。