【问题标题】:Convert varchar to float without losing data [duplicate]将varchar转换为float而不丢失数据[重复]
【发布时间】:2015-07-16 15:44:47
【问题描述】:

我的varchar 类型表中有一个纬度和经度值列表。我希望他们成为float。如何将varchar 转换为float

例如:
varchar 类型的36.26056695 应转换为float 类型的36.26056695

varchar 类型的-99.11080846 应转换为float 类型的-99.11080846

【问题讨论】:

  • 请澄清:您是在尝试将列定义alter 转换为float 还是在select 语句中操作它们而不损失精度?
  • 它是什么? mysql/mariadb?还是 sql-server?
  • MySQL 的 FLOAT 大约 1.7 米或 5.6 英尺。可以吗?

标签: mysql sql sql-server mariadb


【解决方案1】:

使用 Cast 运算符

举例

SELECT CAST('36.26056695' AS float) FROM TABLE

【讨论】:

  • 我有一个包含 10,000 个值的列表。我想使用单个命令更改整个列
  • ALTER TABLE tbl MODIFY COLUMN col FLOAT NOT NULL;
  • 使用这个转换函数会增加查询时间,任何其他解决方案
【解决方案2】:

这取决于您所说的“丢失数据”是什么意思。

如果您的意思是不损失精度,“浮动”将不可靠;它只能可靠地存储 2 的幂的倍数(.125、.25、.375 等......)

如果您只是指转换字段而不使它们变为空白,那么最好的选择是这样的:

ALTER TABLE `the_table` 
   ADD COLUMN `dec_val` NOT NULL DECIMAL(11, 8)
;

UPDATE `the_table` 
   SET `dec_val` = CAST(`str_val` AS DECIMAL(11, 8))
;

ALTER TABLE `the_table` 
   DROP COLUMN `str_val`
;

-- The below is only needed if you wanted to do something like rename the 
-- new column to the same name as the original. Otherwise, you could just
-- have created the new column with the desired name.
ALTER TABLE `the_table` 
   CHANGE COLUMN `dec_val` `desired_column_name` NOT NULL DECIMAL(11, 8)
; 

您当然可以使用 FLOAT 而不是 DECIMAL,但这种方式会保留准确的值。

注意:只需将原始列的定义更改为 DECIMAL(11, 8)可能 工作,但这允许您在之前检查转换后的值(更新之后)你放弃原来的。

【讨论】:

  • 8 位小数是多余的——它足以区分一片头皮屑和另一片头皮屑。 6 个位置足以区分接吻的两个人(16 厘米/6 英寸)。
  • @RickJames 我只是使用问题提供的数据。
  • 好的,那么我的cmets是针对OP的,而不是你。
猜你喜欢
  • 2010-10-29
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 2012-12-01
  • 1970-01-01
相关资源
最近更新 更多