trim() 不会删除数据库字段中的空格

Posted

技术标签:

【中文标题】trim() 不会删除数据库字段中的空格【英文标题】:Whitespace in a database field is not removed by trim() 【发布时间】:2011-07-14 20:01:21 【问题描述】:

我在 mysql 的文本字段中的段落开头有一些空格。

php 中使用 trim($var_text_field) 或在 MySQL 语句中使用 TRIM(text_field) 绝对没有任何作用。这个空白可能是什么?如何通过代码将其删除?

如果我进入数据库并将其退格,它会正确保存。它只是没有通过 trim() 函数删除。

【问题讨论】:

列是什么数据类型,VARCHARCHAR 一些代码确实有助于回答。 这是纯文本还是您使用不同的编码? @krok:该字段是text@JohnP:它被存储为 UTF8_general 它是不间断的空格字符。查看更新的答案 【参考方案1】:
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-byte sequence C2 A0。我尝试使用second parameter to trim(),但这并没有成功。使用示例:

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

TRIM(text_field) 的 MySQL 替代品还删除了 UTF 不间断空格,感谢@RudolfRein 的评论:

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

UTF-8 清单:

(更多检查here)

    确保您的 PHP 源代码编辑器位于 UTF-8 mode without BOM 中。或者设置在preferences。

    确保您的 MySQL 客户端设置为 UTF-8 字符编码(更多 here 和 here),例如

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

    确保您的 HTTP 服务器设置为 UTF-8,例如对于Apache:

    AddDefaultCharset UTF-8

    确保浏览器需要 UTF-8。

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

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

【讨论】:

感谢@tchrist 建议here 关于 preg_replace() 中的 'u' 标志。 是的,谢谢!我的 sql 数据中有 stange 空格...感谢您的 \xc2\xa0 我解决了这样的问题: WHERE REPLACE(rowname, '\xc2\xa0', ' ') LIKE '$searchstring%'【参考方案2】:

如果问题出在 UTF-8 NBSP,另一个简单的选择是:

REPLACE(the_field, UNHEX('C2A0'), ' ')

【讨论】:

哦!简单而完美 仅供初学者参考,完整查询为;更新table_name SET the_field = REPLACE(the_field, UNHEX('C2A0'), ' ')【参考方案3】:

最好的解决方案是结合您已经提到的几件事。

首先对有问题的字符串运行 ORD()。就我而言,我必须先反向运行,因为我的问题字符位于字符串的末尾。

ORD(REVERSE([col name])) 

一旦你发现有问题的字符,运行一个

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

最后,调用一个合适的

TRIM([col_name])

这将从字符串的各个方面彻底消除问题字符,并修剪掉前导(在我的情况下是尾随)字符。

【讨论】:

【参考方案4】:

尝试在text_field上使用MySQL的ORD()函数来检查最左边字符的字符代码。它可以是像空格一样出现的非空格字符。

【讨论】:

这个输出32,是什么意思? 32 是正常空格字符的代码,应该通过 TRIM() MySQL 函数删除。试试ORD(TRIM(text_field)) 这对我有帮助,我的不间断空格返回代码 49824。这是我用来跟踪条目并进行手动清理的内容SELECT * FROM table WHERE (ord(substr(text_field,-1))) > 255 or (ord(substr(text_field,1,1))) > 255' @Benjamin,49824 十进制 = C2A0 十六进制。这是 NO-BREAK SPACE、Unicode (U+00A0) 的 2 字符 UTF-8 代码。请参阅下面的答案。【参考方案5】:

您必须首先检测这些“空白”字符。如果它是一些 HTML 实体,比如 ,当然没有修剪功能会有所帮助。

我建议这样打印出来

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"

【讨论】:

它的结果是:%A0 不知道那是什么意思。 @kylex 怎么说:echo urlencode(trim($row['field'])); 看来我唯一能做的就是substr($row['field'], 2),这样处理的信息很多。【参考方案6】:

尝试通过写出字符代码来检查每个“空白”是什么字符 - 它可能是不被修剪删除的不可见字符类型。 Trim 仅删除了一些字符,例如空格、制表符、换行符、CR 和 NUL,但存在其他可能导致此问题的不可见字符。

【讨论】:

【参考方案7】:

试试

str_ireplace(数组(“\r”,“\n”,“\t”),$var_text_field

【讨论】:

以上是关于trim() 不会删除数据库字段中的空格的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql去掉某个字段多余的空格

oracle中怎样去除字符的前后空格

去除字符串头尾空格的方法

excel 删除字段的前后空格

2020.7.15:

oracle中的trim函数