Замена текстовых строк MySQL - PullRequest
3 голосов
/ 22 мая 2011

Недавно я перешел на другую платформу для своего личного веб-сайта и столкнулся с проблемой, когда прежняя кодировка символов, такая как ", "" и ', теперь странным образом перекодируется как :

“
”
’
’
'

Я видел это раньше, и в прошлый раз я просмотрел вручную и обновил каждую статью. На этот раз, однако, я бы хотел использовать более прагматичный подход, обновляя базу данных.

Как мне заменить все вхождения этих строк их правильными символами?

Я думаю, что это будет что-то вроде:

SELECT REPLACE(''',''')

Но нужно ли быть осторожным и включать экранирующие символы, такие как \? Кроме того, как я могу выполнить этот тип замены для всей базы данных?

Примечание: я буду использовать phpMyAdmin для выполнения этих замен, поэтому я надеюсь, что это всего лишь вопрос ввода серии команд на вкладке «SQL». Хотя у меня есть доступ к серверу MySQL из командной строки, если это необходимо.

Обновление:

Подробнее о структуре:

  • Имя таблицы: "field_data_comment_body"
  • Имя поля: "comment_body_value"
  • Поле, о котором идет речь, имеет тип "longtext"

Я попытался выполнить рекомендацию Йохана, но он возвращает 0 Затронутых строк:

DELIMITER $$

CREATE FUNCTION FixEncoding(input longtext) RETURNS longtext
BEGIN
  DECLARE output longtext;

  SET output = input;   
  SET output = REPLACE(output,''','\'');
  SET output = REPLACE(output,'’','\'');
  SET output = REPLACE(output,'” ','"');
  SET output = REPLACE(output,'“','"');
  SET output = REPLACE(output,'’','\'');

  RETURN output;
END $$

DELIMITER ;

UPDATE field_data_comment_body SET comment_body_value = FixEncoding(comment_body_value) WHERE entity_id <> 0;

Обновление: это не ошибка перевода, так как возвращает 63 строки:

SELECT  `comment_body_value` 
FROM  `field_data_comment_body` 
WHERE  `comment_body_value` LIKE  '%&amp;#039;%'
LIMIT 0 , 30

1 Ответ

3 голосов
/ 22 мая 2011

В MySQL символы могут быть экранированы с помощью \.

Я бы написал функцию, которая заменит вас, а затем сделает обновление, что-то вроде этого.

DELIMITER $$

CREATE FUNCTION FixEncoding(input varchar) RETURNS varchar
BEGIN
  DECLARE output varchar;

  SET output = input;   
  SET output = REPLACE(output,'&#039;','\'');
  SET output = REPLACE(output, .....
  .....

  RETURN output;
END $$

DELIMITER ;

UPDATE table1 SET column1 = FixEncoding(Column1) WHERE id <> 0;

Если это не сработает, возможно, вы страдаете от проблемы перевода между базой данных и уровнем представления.
Сделайте резервную копию вашей базы данных
и измените кодировку ваших таблиц, используя:

ALTER TABLE `test`.`test` CHARACTER SET latin1 COLLATE latin1_general_ci;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...