Пробелы в поле базы данных не удаляются с помощью trim () - PullRequest
3 голосов
/ 14 марта 2011

У меня есть пробел в начале абзаца в текстовом поле в MySQL.

Использование trim($var_text_field) в PHP или TRIM(text_field) в инструкциях MySQL абсолютно ничего не делает.Что это может быть за пробел и как мне удалить его по коду?

Если я захожу в базу данных и возвращаю ее назад, она сохраняется должным образом.Это просто не удаляется через функции trim ().

Ответы [ 7 ]

12 голосов
/ 28 марта 2013
function UberTrim($s) {
    $s = preg_replace('/\xA0/u', ' ', $s);  // strips UTF-8 NBSP: "\xC2\xA0"
    $s = trim($s);
    return $s;
}

Кодировка символов UTF-8 для пространства без перерывов, Unicode (U + 00A0), представляет собой 2-байтовую последовательность C2 A0.Я пытался использовать второй параметр для trim(), но это не сработало.Пример использования:

assert("abc" === UberTrim("  \r\n  \xc2\xa0  abc  \t \xc2\xa0   "));

Замена MySQL для TRIM(text_field), которая также удаляет пробелы UTF без перерывов, благодаря комментарию @ RudolfRein:

TRIM(REPLACE(text_field, '\xc2\xa0', ' '))

UTF-8 контрольный список:

(больше проверок здесь )

  1. Убедитесь, что ваш PHP редактор исходного кода находится в Encode in UTF-8 without BOM (Notepad++) Режим UTF-8 без спецификации .Или установите в настройках .

  2. Убедитесь, что ваш клиент MySQL настроен на кодировку символов UTF-8 (подробнее здесь и здесь ), например,

    $pdo = new PDO('mysql:host=...;dbname=...;charset=utf8',$userid,$password); $pdo->exec("SET CHARACTER SET utf8");

  3. Убедитесь, что сервер HTTP установлендля UTF-8, например, для Apache :

    AddDefaultCharset UTF-8

  4. Убедитесь, что браузер ожидает UTF-8.

    header('Content-Type: text/html; charset=utf-8');

    или

    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

3 голосов
/ 30 мая 2017

Если проблема с UTF-8 NBSP, другой простой вариант:

REPLACE(the_field, UNHEX('C2A0'), ' ')
2 голосов
/ 21 марта 2014

Лучшее решение - это сочетание нескольких вещей, о которых вы уже упоминали.

Сначала запустите ORD () для рассматриваемой строки.В моем случае мне сначала пришлось запустить реверс, потому что мой символ проблемы был в конце строки.

ORD(REVERSE([col name])) 

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

REPLACE([col_name], char([char_value_returned]), char(32))

Наконецвызовите правильный

TRIM([col_name])

Это полностью уничтожит проблемный символ во всех аспектах строки и обрежет начальный (в моем случае завершающий) символ.

2 голосов
/ 14 марта 2011

Попробуйте использовать функцию MySQL ORD() на text_field, чтобы проверить код символа самого левого символа. Это могут быть непробельные символы, которые отображаются как пробелы.

1 голос
/ 14 марта 2011

вы должны сначала обнаружить эти пробельные символы.если это какая-то HTML-сущность, например &nbsp;, то никакая функция обрезки не поможет, конечно.

Я бы предложил распечатать ее вот так

echo urlenclde($row['field']);

и посмотреть, что там написано

Также как неразрывный пробел A0 (или 160 десятичных знаков), вы можете сначала преобразовать его в порядковый:

<pre><?php
$str = urldecode("%A0")."bla";
var_dump(trim($str));
$str = str_replace(chr(160)," ",$str);
$str = trim($str);
var_dump($str);

и, да-да!-

string(4) " bla"
string(3) "bla"
0 голосов
/ 14 марта 2011

попробуй


str_ireplace(array("\r", "\n", "\t"), $var_text_field

0 голосов
/ 14 марта 2011

Попытайтесь проверить, какой символ у каждого «пробела», записав код символа - это может быть невидимый тип символов, который не удаляется отделкой.Обрезка удаляет только несколько символов, таких как пробелы, символы табуляции, новой строки, CR и NUL, но существуют другие невидимые символы, которые могут вызвать эту проблему.

...