Как удалить начальные и конечные пробелы в поле MySQL? - PullRequest
119 голосов
/ 28 июля 2011

У меня есть таблица с двумя полями (страны и коды ISO):

Table1

   field1 - e.g. 'Afghanistan' (without quotes)
   field2 - e.g. 'AF'(without quotes)

В некоторых строках второе поле имеет пробел в начале и / или конце, что влияет на запросы.

Table1

   field1 - e.g. 'Afghanistan' (without quotes) 
   field2 - e.g. ' AF' (without quotes but with that space in front)

Есть ли способ (в SQL) просмотреть таблицу и найти / заменить пробел в field2?

Ответы [ 10 ]

246 голосов
/ 28 июля 2011

Вы ищете TRIM .

UPDATE FOO set FIELD2 = TRIM(FIELD2);
34 голосов
/ 22 мая 2014

Общий ответ, который я составил из ваших ответов и из других ссылок, и он работал для меня, и я написал его в комментарии:

 UPDATE FOO set FIELD2 = TRIM(Replace(Replace(Replace(FIELD2,'\t',''),'\n',''),'\r',''));

и т.д.

Так как trim () не удаляет все пробелы, поэтому лучше заменить все пробелы, которые вам нужны, а не обрезать их.

Надеюсь, я смогу помочь вам поделиться своим ответом:)

25 голосов
/ 24 сентября 2012

Пожалуйста, примите во внимание вариант использования, прежде чем использовать это решение:

Обрезка не работает при выполнении запроса выбора

Это работает

select replace(name , ' ','') from test;

Хотя это не

select trim(name) from test;
16 голосов
/ 19 ноября 2012

Для ясности, TRIM по умолчанию удаляет только пробелы (не все пробелы). Вот документация: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_trim

9 голосов
/ 04 августа 2016

Кажется, что ни один из текущих ответов на самом деле не удалит 100% пробелов из начала и конца строки.

Как упоминалось в других публикациях, по умолчанию TRIM удаляются только пробелы, но не вкладки, каналы и т. Д. Комбинация TRIM с указанием других символов пробела может обеспечить ограниченное улучшение, например, TRIM(BOTH '\r' FROM TRIM(BOTH '\n' FROM TRIM(BOTH '\f' FROM TRIM(BOTH '\t' FROM TRIM(txt))))). Но проблема этого подхода в том, что для конкретного TRIM может быть указан только один символ, и эти символы удаляются только в начале и в конце. Таким образом, если обрезаемая строка имеет вид, подобный \t \t \t \t (то есть альтернативные пробелы и символы табуляции), потребуется больше TRIM s - и в общем случае это может продолжаться бесконечно.

Для облегченного решения должна быть возможность написать простую пользовательскую функцию (UDF), которая будет выполнять эту работу путем циклического перебора символов в начале и конце строки. Но я не собираюсь этого делать ... поскольку я уже написал более тяжелый заменитель регулярных выражений , который также может выполнять эту работу - и может пригодиться по другим причинам, как описано в это сообщение в блоге .

Демо

Rextester online demo . В частности, последняя строка показывает, что другие методы не работают, но метод регулярного выражения завершается успешно.

SQL (код функции для краткости опущен)

SELECT reg_replace(
         reg_replace(txt,
                     '^[[:space:]]+',
                     '',
                     TRUE,
                     1,
                     0),
         '[[:space:]]+$',
         '',
         TRUE,
         1,
         0) AS `trimmed txt`
FROM tbl;
3 голосов
/ 05 марта 2013

Это утверждение удалит и обновит содержимое поля вашей базы данных

Для удаления пробелов в левой части поля значения

ОБНОВЛЕНИЕ таблицы SET SET field1 = LTRIM (field1);

ех. Элемент UPDATE SET firstName = LTRIM (firstName);

Чтобы удалить пробелы в правой части поля значения

ОБНОВЛЕНИЕ таблицы SETfield1 = RTRIM (поле1);

ех. Элемент UPDATE SET firstName = RTRIM (firstName);

1 голос
/ 01 августа 2017

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

UPDATE `TABLE` SET `FIELD`= TRIM(FIELD);

или

UPDATE 'TABLE' SET 'FIELD' = RTRIM(FIELD);

или

UPDATE 'TABLE' SET 'FIELD' = LTRIM(FIELD);

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

1 голос
/ 09 октября 2013

Если вам нужно использовать обрезку в запросе выбора, вы также можете использовать регулярные выражения

SELECT * FROM table_name WHERE field RLIKE ' * query-string *'

возвращать строки с полем, например 'query-string'

0 голосов
/ 03 февраля 2013

Вы можете использовать ltrim или rtrim для очистки пробелов справа или слева или строки.

0 голосов
/ 18 декабря 2012

Я знаю, что это уже принято, но для таких, как я, которые ищут «удалить ВСЕ пробелы» (не только в начале и в конце строки):

select SUBSTRING_INDEX('1234 243', ' ', 1);
// returns '1234'

РЕДАКТИРОВАТЬ 2019/6/20: Да, это не хорошо. Функция возвращает часть строки, так как «когда символьное пространство появилось в первый раз». Итак, я предполагаю, что, сказав это, удалите начальные и конечные пробелы и верните первое слово:

select SUBSTRING_INDEX(TRIM(' 1234 243'), ' ', 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...