在MySQL中,如果你有一个名为 averagescore 的列,其当前数据类型为字符串(VARCHAR 或类似类型),并且存储的数据如 267.000000,而你希望将其更改为一个数值类型,并且以 267.0 的格式保存(尽管数值类型本身不存储格式,只是在显示时可能会以特定格式呈现),你可以按照以下步骤操作:
- 选择新的数据类型:
- 由于你希望数值能够包含小数点,并且可能希望有一定的精度,
DECIMAL类型是一个很好的选择。你可以指定总位数和小数位数,例如DECIMAL(10,1)表示最多10位数字,其中1位是小数。但根据你的需求,DECIMAL(10,5)或DECIMAL(10,1)都可能是合适的(取决于你是否需要存储更多的小数位)。然而,要注意267.0本身只需要DECIMAL(5,1)就足够了。
- 由于你希望数值能够包含小数点,并且可能希望有一定的精度,
- 修改列的数据类型:
- 使用
ALTER TABLE语句来修改列的数据类型。在执行此操作之前,最好先备份你的数据,以防万一出现不可预见的问题。
- 使用
- 考虑数据转换:
- 在修改数据类型之前,你可能需要将现有的字符串数据转换为数值类型。这通常可以在
ALTER TABLE语句中通过USING子句完成,但MySQL不直接支持在ALTER TABLE ... MODIFY COLUMN中转换类型。因此,你可能需要先创建一个新列,将数据转换后复制到新列,然后删除旧列并重命名新列。
- 在修改数据类型之前,你可能需要将现有的字符串数据转换为数值类型。这通常可以在
下面是一个简化的示例流程:
-- 1. 添加一个新列,数据类型为 DECIMAL |
ALTER TABLE your_table_name ADD COLUMN averagescore_temp DECIMAL(10,1); |
-- 2. 将数据从字符串转换为 DECIMAL 并复制到新列 |
UPDATE your_table_name SET averagescore_temp = CAST(averagescore AS DECIMAL(10,1)); |
-- 注意:这里使用了 CAST 函数进行转换,但可能需要根据实际情况调整小数位数。 |
-- 由于你希望结果是 267.0,而 DECIMAL(10,1) 会四舍五入到一位小数,这通常是可接受的。 |
-- 如果你需要精确控制小数位数,请调整 DECIMAL 的精度和小数位数。 |
-- 3. 删除旧列 |
ALTER TABLE your_table_name DROP COLUMN averagescore; |
-- 4. 重命名新列为旧列名 |
ALTER TABLE your_table_name CHANGE COLUMN averagescore_temp averagescore DECIMAL(10,1); |
注意:
- 在执行上述 SQL 语句之前,请确保替换
your_table_name为你的实际表名。 - 上述步骤中的
DECIMAL(10,1)可能需要根据你的具体需求进行调整。如果你确定数据永远不会超过99999.9,那么DECIMAL(6,1)就足够了。 - 在执行
UPDATE语句之前,最好先检查一些数据以确保转换是正确的。你可以使用SELECT语句来查看转换后的数据。 - 如果你关心数值的显示格式(即小数点后的位数),请注意,
DECIMAL类型本身不控制显示格式;这是应用程序或查询工具的责任。在 MySQL 查询中,你可以使用FORMAT()函数或类似的方法来格式化输出。
在执行第二步复制的时候,出现报错
UPDATE `wht_wcs`.`gaomajor` SET averagescore_temp = CAST(averagescore AS DECIMAL(10,1));
/* SQL错误(1292):Truncated incorrect DECIMAL value: '520. 8' */
错误 SQL(1292):“Truncated incorrect DECIMAL value: '520. 8'” 指出在尝试将 averagescore 列中的字符串值 '520. 8' 转换为 DECIMAL 类型时发生了问题。这里的问题是字符串值 '520. 8' 包含了一个额外的空格字符,这导致它不是一个有效的 DECIMAL 值。 解决方法如下:
UPDATE `wht_wcs`.`gaomajor`
SET averagescore_temp = CAST(REPLACE(TRIM(averagescore), ' .', '.') AS DECIMAL(10,1))
WHERE averagescore IS NOT NULL AND averagescore <> '';
2016

被折叠的 条评论
为什么被折叠?



