我的数据库中存在隐藏的非ASCII字符(空格)问题。
如何用普通空格替换它们并在插入之前转换它们以避免将来出现问题?
我仍然不能100%确定发生了什么,但我认为这是非ASCII空间。任何帮助追踪它的建议都会有所帮助。
以下是发生的事情:
我有一个包含关键字的数据库,如果我搜索“测试关键字”,则不显示任何内容。我知道“test keyword”在数据库中。
如果我搜索“test”或“keyword”,它会显示出来。
如果我使用以下方式进行查询:
SELECT * FROM keywords WHERE keyword regexp '[^ -~]';
(found here)
它将显示“test keyword” - 给出结论,在“test keyword”中有一个非ASCII字符和空格。
答案 0 :(得分:5)
This适用于PHP:
str_replace("\xA0", ' ', $keyword)
现在我正在尝试替换数据库中所有现有的。
我认为这应该有效,但事实并非如此:
update keywords set keyword = replace(keyword, char(160), " ") WHERE keyword regexp char(160);
有什么想法吗?
答案 1 :(得分:3)
我遇到了同样的问题,并且能够创建更新查询以替换(在我的情况下)非中断空格。
首先,我分析了具有这些字符的字符串的二进制值(我使用了Mysql workbench'在编辑器中打开值)这样做。我意识到在我的情况下,我想要替换的字符有一个十六进制值'a0'。
接下来,我转到此页面http://www.fileformat.info/info/unicode/char/a0/charset_support.htm并检查了将a0解释为非中断空间的所有编码。
接下来我构建了这个查询
UPDATE keywords SET keyword = TRIM(REPLACE(keyword, CONVERT(char(160) USING hp8), ' '));
,我选择了hp8,但utf8也可以。
我花了一些时间来达到这个解决方案......所以我希望这可以帮助有同样问题的人,而不是试图找到解决方案。
答案 2 :(得分:1)
怎么样:
update keywords
set keyword = replace(keyword, char(160), ' ')
WHERE keyword LIKE concat('%',char(160),'%');
答案 3 :(得分:0)
是否要删除所有非字母数字字符?
$string = “Here! is some text, and numbers 12345, and symbols !£$%^&”;
$new_string = preg_replace(“/[^a-zA-Z0-9\s]/”, “”, $string);