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() 函数删除。
【问题讨论】:
列是什么数据类型,VARCHAR
或 CHAR
?
一些代码确实有助于回答。
这是纯文本还是您使用不同的编码?
@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 实体,比如&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"
【讨论】:
它的结果是:%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() 不会删除数据库字段中的空格的主要内容,如果未能解决你的问题,请参考以下文章