MySQL —将T1中的VARCHAR值插入T2中的DECIMAL字段

问题描述

| 在表_1中,我从电子表格中导入了数据。在一个表格列中,存在混合值:94.7、45.0、36,汽车,公交车...等。数据类型为VARCHAR(10) 我想将Table_1中此列的值插入Table_2中的DECIMAL(5,1)字段中。我希望将非数字值注册为0.0。这个很重要。 我已经尝试了多种方法包括在我的MysqL GUI中可以使用的CAST(),但给出了一系列警告。这是我尝试过的sql类型的示例。
DELETE FROM table_2;
INSERT INTO table_2 (NAME,decimal_column)
   (SELECT NAME,CAST(varchar_column AS DECIMAL(5,1))
      FROM table_1) ;
MysqL警告示例。   警告代码:1366不正确的十进制   值:-1行第\'\'列的\'\'      警告代码:1292被截断   DECIMAL值不正确:\'house \' 而且,PHP将一无所有。当我尝试使用PHP运行相同的查询时,出现以下致命错误消息:   不正确的十进制值:列的\'\'   -1行的\'\' 谢谢你的建议     

解决方法

        如果要清除
table_2
,可以使用
TRUNCATE table_2;
,这可能会更快。 一种执行此操作的方法(尽管我不知道它是否是最好的;对于大型数据集来说可能有点慢)是使用正则表达式:
INSERT INTO table_2 (NAME,decimal_column)
(SELECT NAME,IF(varchar_column REGEXP \'^[[:digit:].]+$\',varchar_column,0.0)
  FROM table_1) ;
假设
varchar_column
的十进制值中没有空格。如果可能的话,您可以按以下方式使用
TRIM
IF(TRIM(varchar_column) REGEXP \'^[[:digit:].]+$\',TRIM(varchar_column),0.0)
    ,        我尝试了以下方法,对我来说非常有用:
INSERT INTO `table_2` (`decimal_column`) SELECT CAST(`varchar_column` AS DECIMAL(5,1)) FROM `table_1`;
我使用的表有一个空白值,一个十进制值(作为VARCHAR)和单词“ house”,并且一切都按预期进行了转换。 警告可以忽略。从本质上讲,它是MySQL告诉您它试图转换无法转换的数据。例如,单词“ house”不能转换为十进制值,因此MySQL警告您(PHP也警告您)。您在MySQL GUI中看不到错误的原因是因为错误由于查询有效而被抑制。 如果要隐藏错误,可以始终在PHP调用前添加一个@符号(即@ mysqli-> query(\'... \'),使用ini_set(\'display_errors \',false)来禁用所有错误或error_reporting(E_NONE)。