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

时间:2011-06-13 01:48:16

标签: php mysql types decimal varchar

在Table_1中,我从电子表格导入了数据。在一个表格列中有混合值:94.7,45.0,36,汽车,公共汽车......等。数据类型为VARCHAR(10)

我想将Table_1中此列的值插入Table_2中的DECIMAL(5,1)字段。我希望非数字值注册为0.0。这很重要。

我尝试了几件事,包括CAST(),它可以在我的MySQL GUI中运行,但会提供一系列警告。这是我尝试过的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行

感谢您的任何建议

2 个答案:

答案 0 :(得分:3)

如果您要清除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)

答案 1 :(得分:1)

我尝试了以下内容,它对我很有用:

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->查询('...'),使用ini_set('display_errors',false)禁用所有错误,或者error_reporting(E_NONE)。