Как заменить без ошибки синтаксиса MariaDB - PullRequest
3 голосов
/ 10 мая 2019

Я вижу примеры замены SQL   в базах данных MySQL / MariaDB:

UPDATE wp_posts SET post_content = REPLACE(post_content, ' ', ' ');

... но это утверждение выдает ошибку:

#1064 - You have an error in your SQL syntax; check the manual that 
corresponds to your MariaDB server version for the right syntax to 
use near ''&nbsp)' at line 1

Я вижу '' и )' - я пытался избежать точки с запятой с обратной косой чертой \:

UPDATE wp_posts SET post_content = REPLACE(post_content, '&nbsp\;', ' ');

... но получите примерно ту же ошибку. На самом деле, я вижу много примеров SQL для MySQL / MariaDB, и они не экранируют ни точку с запятой, ни амперсанд.

EDIT

@ Barmar рекомендует запускать SQL из командной строки. Я вошел в MariaDB и вошел в «use mydatabase». Приглашение изменилось, чтобы указать текущий дБ, и я ввел команду, как указано выше. Команда была принята без ошибок, найдено более 2300 совпадений, но ничего не изменилось:

MariaDB [mydatabase]> UPDATE wp_posts SET post_content = REPLACE(post_content, ' ', ' ');
Query OK, 0 rows affected (0.25 sec)
Rows matched: 2330  Changed: 0  Warnings: 0

Почему ничего не изменилось?

РЕДАКТИРОВАТЬ - Включить ГДЕ

Я все больше и больше путаюсь. Из phpMyAdmin :

SELECT * from wp_posts WHERE post_content LIKE '%Â %'; << == Возвращает 1715 строк </p>

Еще и в phpMyAdmin:

UPDATE wp_posts SET post_content = REPLACE(post_content, 'Â ', ' ') WHERE post_content LIKE '%Â %'; << == Возвращает 0 подходящих строк </p>

Из CLI:

SELECT COUNT(*) from wp_posts WHERE post_content LIKE 'Â '; << == Возвращает 0 </p>

SELECT COUNT(*) from wp_posts WHERE post_content LIKE 'Â'; << == Возвращает 8 </p>

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

1 Ответ

0 голосов
/ 22 мая 2019

'Â&nbsp;' заставляет меня поверить, что проблема не в том, что вы думаете.

Выполните отладку, выполните SELECT HEX(col)... для одной из строк исходного кода, которую вы пытаетесь исправить.Я подозреваю, что вы найдете C2A0 в шестнадцатеричной строке.Это кодировка utf8 для того, что превращается в &nbsp; при использовании htmlentities ().

У вас также могут быть проблемы с наборами символов.Узнайте, какие настройки действуют в phpmyadmin;SHOW VARIABLES LIKE 'char%';SHOW CREATE TABLE.Я спрашиваю об этом, потому что между латиницей 1 A0 и UTF-8 C2A0, которая вносит путаницу, может возникнуть некоторая путаница.

Во многих контекстах "жесткий пробел" (hex * 1015)*) выглядит как обычное пространство (гекс 20), что затрудняет дальнейшее решение, что к чему.

Подведите итог:

  1. Узнайте, чтоВы действительно имеете через SELECT HEX()
  2. Исправьте настройки - либо используйте latin1 повсюду, либо используйте utf8 / utf8mb4 повсюду.
  3. Затем переосмыслите каквыполнить замену (если шаг 2 не помог исправить ее).

В основном я вижу A0 из документов Microsoft Word, но, вероятно, существуют другие источники.

При неправильном толкованиикак latin1, utf8 C2A0 отображается как Â (A-окружность и пробел).

...