代码之家  ›  专栏  ›  技术社区  ›  Antonio Mailtraq

将MySQL表varchar字段更改为十进制字段:截断了不正确的十进制值

  •  0
  • Antonio Mailtraq  · 技术社区  · 8 年前

    我需要在我的DB MySQL表中转换来自 VARCHAR(255) 到 十进制(10,5) .

    我尝试了这个SQL查询,其中第一个替换 ',' 具有 '.' 然后将新列值设置为 十进制(10,5) :

    [SQL]UPDATE `doTable`
    SET doAV = REPLACE (doAV, ',', '.')
    WHERE
        YEAR (`doDate`) IN (YEAR(CURDATE()));
    Affected rows: 83169
    Time: 1.846s
    
    [SQL]
    ALTER TABLE `doTable` MODIFY COLUMN doAV DECIMAL (10, 5);
    [Err] 1292 - Truncated incorrect DECIMAL value: '2226,000'
    

    但我有个错误:

    [Err] 1292 - Truncated incorrect DECIMAL value: '2226,000'
    

    你能帮助我吗?

    提前感谢您的帮助,非常感谢。

    #编辑01

    +----------+
    | doAV     |
    +----------+
    | 2226.000 |
    | 2226.00  |
    | 2225.750 |
    | 2225.600 |
    | 2225.533 |
    | 2225.250 |
    | 2225.000 |
    | 2225.00  |
    | 2224.800 |
    | 2224.667 |
    +----------+
    

    #编辑02

    +-----------+
    | doAV      |
    +-----------+
    | 2226.000  |
    | 792.000   |
    | 338.400   |
    | 13635.000 |
    | 1438.125  |
    | 220.800   |
    | 172.000   |
    | 253.000   |
    | 4258.500  |
    | 352.800   |
    +-----------+
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Sergey Menshov    8 年前

    我认为您只更新了中的行 YEAR (doDate) IN (YEAR(CURDATE())) . 首先尝试更新所有行。删去 WHERE 来自您的 UPDATE 然后再次运行。

    试着只检查整个部分

    SELECT *
    FROM doTable
    WHERE LENGTH(LEFT(doAV,IFNULL(NULLIF(LOCATE('.',doAV)-1,-1),LENGTH(doAV))))>5
    

    DECIMAL(10, 5) =>你的整个部分只能包含5个数字(10-5=5)。