Удаление возврата каретки из базы данных - PullRequest
0 голосов
/ 29 января 2020

Я так растерялся. Я использовал следующий запрос, чтобы избавиться от нежелательных результатов в данных. Он работал нормально для всех полей, кроме «first_name». Вместо этого он изменил все поля first_name на «0». Нет разницы между заменой first_name и остальными, верно? Я не понимаю, что случилось!

UPDATE donors
    SET 
        `first_name` = Replace(Replace(`first_name`, CHAR(13), ''), CHAR(10), '')
    AND
        `last_name` = Replace(Replace(`last_name`, CHAR(13), ''), CHAR(10), '')
    AND
        `address_1` = Replace(Replace(`address_1`, CHAR(13), ''), CHAR(10), '')
    AND
        `city` = Replace(Replace(`city`, CHAR(13), ''), CHAR(10), '')
    AND
        `zipcode` = Replace(Replace(`zipcode`, CHAR(13), ''), CHAR(10), '')

Я использую MYSQL, и это единственный запрос, который я использовал. Изменение произошло, когда я его выполнил. Я копирую и вставляю его сюда.

Вот DDL:

CREATE TABLE IF NOT EXISTS `donors` (
  `donor_id` int(11) NOT NULL AUTO_INCREMENT,
  `first_name` text NOT NULL,
  `last_name` text NOT NULL,
  `company` text NOT NULL,
  `donor_notes` text NOT NULL,
  `email_1` text NOT NULL,
  `email_2` text NOT NULL,
  `phone_1` text NOT NULL,
  `phone_2` text NOT NULL,
  `fax` text NOT NULL,
  `address_1` text NOT NULL,
  `address_2` text NOT NULL,
  `city` text NOT NULL,
  `state` varchar(50) NOT NULL,
  `zipcode` varchar(11) NOT NULL,
  `country` text NOT NULL,
  `password` text NOT NULL,
  `salt` text NOT NULL,
  `newsletter` text NOT NULL,
  `address_id` text NOT NULL,
  `ip` text NOT NULL,
  `status` text NOT NULL,
  `approved` text NOT NULL,
  `date_created` datetime NOT NULL,
  PRIMARY KEY (`donor_id`)
) ENGINE=InnoDB AUTO_INCREMENT=445 DEFAULT CHARSET=latin1;

1 Ответ

1 голос
/ 29 января 2020

Как я уже упоминал в своем комментарии, я думаю, что проблема все эти AND. В MySql между каждым обновленным полем вы должны вставить запятую, а не AND, которая используется для условий.

Поэтому, когда вы запустили это:

UPDATE donors
SET 
    `first_name` = Replace(Replace(`first_name`, CHAR(13), ''), CHAR(10), '')
AND
    `last_name` = Replace(Replace(`last_name`, CHAR(13), ''), CHAR(10), '')
....

Что вы фактически было:

UPDATE donors
SET 
    `first_name` = some_varchar AND condition AND condition AND condition AND condition

Каждое из этих условий сравнивало каждый столбец с самим собой после выполнения замен. Просто будучи одним из этих ложных, результат был 0. И вот почему это значение было сохранено в вашем столбце.

Ваш скрипт должен был выглядеть так:

UPDATE donors
SET 
    `first_name` = Replace(Replace(`first_name`, CHAR(13), ''), CHAR(10), ''),
    `last_name` = Replace(Replace(`last_name`, CHAR(13), ''), CHAR(10), ''),
    `address_1` = Replace(Replace(`address_1`, CHAR(13), ''), CHAR(10), ''),
    `city` = Replace(Replace(`city`, CHAR(13), ''), CHAR(10), ''),
    `zipcode` = Replace(Replace(`zipcode`, CHAR(13), ''), CHAR(10), '')

Ссылки:

https://www.mysqltutorial.org/mysql-update-data.aspx

https://dev.mysql.com/doc/refman/8.0/en/update.html

Кстати, все эти ` не нужны, вам нужно только когда столбец содержит пробелы или является зарезервированным ключевым словом.

...