从CAST DECIMAL到INT


81

我正在尝试这样做:

SELECT CAST(columnName AS INT), moreColumns, etc
FROM myTable
WHERE ...

我在这里查看了帮助常见问题解答:http : //dev.mysql.com/doc/refman/5.0/en/cast-functions.html,它说我可以这样做CAST(val AS TYPE),但它不起作用。

尝试将小数转换为int,实际值为223.00,我想要223


强制转换的警告是因为您要提供字符串,您可以确认吗?
2011年

它甚至与maria DB一起工作
-Niyati

Answers:


126

您可以这样尝试FLOOR函数:

SELECT FLOOR(columnName), moreColumns, etc 
FROM myTable 
WHERE ... 

如果您知道可以省略小数位,也可以尝试使用FORMAT函数:

SELECT FORMAT(columnName,0), moreColumns, etc 
FROM myTable 
WHERE ... 

您可以结合使用这两个功能

SELECT FORMAT(FLOOR(columnName),0), moreColumns, etc 
FROM myTable 
WHERE ... 

2
您意识到您不应该在SQL代码中处理格式吗?
fredley

做得好,+ 1。格式适合我的情况,但是我仍然想知道是否有人可以使用CAST做到这一点
Drahcir

@TomMedley:是的,如果我也使用PHP,我也不会,但这仅用于某些触发器和函数
Drahcir 2011年

2
@TomMedley我会更加细微:创建视图时,SQL查询中的格式会派上用场。
VH-NZZ 2014年

1
这会将逗号添加为数字的千位分隔符。
JanŠpaček

22

更优化的方式 以此目的*:

SELECT columnName DIV 1 AS columnName, moreColumns, etc
FROM myTable
WHERE ...

使用DIV 1是对FLOOR巨大改进,更不用说像FORMAT这样基于字符串的函数了

mysql> SELECT BENCHMARK(10000000,1234567 DIV 7) ;
+-----------------------------------+
| BENCHMARK(10000000,1234567 DIV 7) |
+-----------------------------------+
|                                 0 |
+-----------------------------------+
1 row in set (0.83 sec)

mysql> SELECT BENCHMARK(10000000,1234567 / 7) ;
+---------------------------------+
| BENCHMARK(10000000,1234567 / 7) |
+---------------------------------+
|                               0 |
+---------------------------------+
1 row in set (7.26 sec)

mysql> SELECT BENCHMARK(10000000,FLOOR(1234567 / 7)) ;
+----------------------------------------+
| BENCHMARK(10000000,FLOOR(1234567 / 7)) |
+----------------------------------------+
|                                      0 |
+----------------------------------------+
1 row in set (8.80 sec)

(*)注意:如Grbts所指出的,当与非无符号/正值一起使用时,请注意DIV 1的行为。


21

从您链接到的文章:

该类型可以是以下值之一:

BINARY [(N)]

字符[(N)]

日期

约会时间

DECIMAL [(M [,D])]

签名[INTEGER]

时间

未签名的[INTEGER]

尝试SIGNED代替INT


谢谢,但是我现在遇到另一个错误:错误代码1292,SQL状态22001:数据截断:截断了不正确的INTEGER值:'
558.00'– Drahcir


10

floor()和DIV 1之间有一个重要区别。对于负数,它们的行为有所不同。DIV 1返回整数部分(如带符号的转换一样),而floor(x)返回“不大于x的最大整数值”(来自手册)。因此:select floor(-1.1)结果为-2,而select -1.1 div 1结果为-1


10

CAST()函数在MySQL中不支持“官方”数据类型“ INT”,也不在支持的类型列表中。在MySQL中,可以使用“ SIGNED”(或“ UNSIGNED”)代替:

CAST(columnName AS SIGNED)

但是,这似乎是特定于MySQL的(未标准化),因此它可能不适用于其他数据库。至少此文档(第二次非正式审核草案)ISO / IEC 9075:1992,数据库未在章节中列出“签名” /“未签名” 4.4 Numbers

但是DECIMAL是MySQL的标准化和受支持的,因此以下内容适用于MySQL(经过测试)和其他数据库:

CAST(columnName AS DECIMAL(0))

根据MySQL文档

如果小数位数为0,则DECIMAL值不包含小数点或小数部分。



3

您可以尝试:

SELECT columnName1, CAST(columnName2 AS  SIGNED ) FROM tableName 

1

尝试 cast (columnName as unsigned)

无符号仅是正值

如果要包含负值,则cast (columnName as signed)
符号(负包含)和无符号(符号大小的两倍,但非负)之间的差


1

1美分:无空格b / w CAST和(表示)。即,CAST(列名已签名)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.