#php #mysql #types #decimal #varchar
#php #mysql #типы #десятичное #varchar
Вопрос:
В Table_1 я импортировал данные из электронной таблицы. В одном столбце таблицы есть смешанные значения: 94,7, 45,0, 36, автомобиль, автобус …. и т.д. Тип данных — VARCHAR(10)
Я хочу вставить значения из этого столбца из Table_1 в ДЕСЯТИЧНОЕ (5,1) поле в Table_2. Я хочу, чтобы нечисловые значения регистрировались как 0.0. Это важно.
Я пробовал несколько способов, включая CAST(), который работает в моем графическом интерфейсе MySQL, но выдает длинную серию предупреждений. Вот пример типа 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 Усеченное неверное десятичное значение: ‘house’
Кроме того, в PHP ничего этого не будет. Когда я пытаюсь выполнить тот же запрос с помощью PHP, я получаю это сообщение о неустранимой ошибке:
Неверное десятичное значение: «для столбца» в строке -1
Спасибо за любые предложения
Ответ №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)
Комментарии:
1. Да, mjec, это сработало. Никаких предупреждающих сообщений MySQL вообще! Спасибо!
2. Стоит отметить для потомков, что это может вызвать ошибки, если столбец содержит значения типа
'2.2.2'
в этом случаеREGEXP
необходимо было бы записать. Но рад, что у тебя это сработало, @ dave!
Ответ №2:
Я пробовал следующее, и у меня это отлично сработало:
INSERT INTO `table_2` (`decimal_column`) SELECT CAST(`varchar_column` AS DECIMAL(5,1)) FROM `table_1`;
В таблице, которую я использовал, было пустое значение, десятичное значение (как VARCHAR) и слово «house», и все было преобразовано, как ожидалось.
Предупреждения могут быть проигнорированы. По сути, MySQL сообщает вам, что он пытался преобразовать данные, которые не смог преобразовать. Например, слово «house» не может быть преобразовано в десятичное значение, поэтому MySQL предупреждает вас (как и PHP.) Причина, по которой вы не видите ошибку в графическом интерфейсе MySQL, заключается в том, что ошибка подавлена, поскольку запрос сработал.
Если вы хотите скрыть ошибки, вы всегда можете добавить символ @ перед вызовом PHP (например, @mysqli->query(‘…’), используйте ini_set(‘display_errors’, false), чтобы отключить все ошибки, или error_reporting(E_NONE).
Комментарии:
1. Спасибо, Франсуа. Я пробовал это, но я хотел посмотреть, есть ли способ избавиться от предупреждающих сообщений MySQL.
2. Если вы хотите удалить сообщения, попробуйте ввести @ перед вызовом. Это лучший способ удалить сообщение об ошибке только для этого вызова. Если вы хотите это для всего этого PHP-скрипта, используйте параметры ini_set(‘display_errors’, false) или error_reporting(E_NONE).
3. Я не уверен, что это сработает, учитывая, что клиент mysql выдает ошибку обратно на PHP (PHP выполняет одну инструкцию).
4. MySQL на самом деле не выдает ошибок, просто предупреждения. Это будет работать просто отлично. Я действительно протестировал это для вас! 🙂