MySQL SELECT 不适用于包含换行符的文本

MySQL SELECT not working for text containing a newline

如果文本已经存在,我正在尝试使用 PHP 的 PDO 在 table 中搜索。

问题是如果文本包含换行符,MySQL 找不到 table 中的行。

我的查询是:

SELECT * FROM tableName WHERE colName = 'test
other chars \ '' " _ \% àèìòù'

如果我删除新行,它会找到该行。

编辑:

我发现 SELECT 找到行 仅当 该行的内容被保存并用 \n 替换换行符,回车 return 与 \r 和选项卡与 \t.

例如 PHP:

$text = str_replace(array("\n", "\r", "\t", "'", "\"), array("\n", "\r", "\t", "''", "\\"), $text;
$query = "INSERT INTO tableName SET colName = '$text'";
...

这样做是真的还是我遗漏了其他东西?

将您要搜索的词组成一个数组。而不是使用 LIKE 关键字将该数组放在 SQL 中。您的问题将得到解决。

//Sudo for Understanding
SELECT * FROM tableName WHERE colName like concat('%test%', '%other%', '%chars%')

如果您知道任何特定的字符串,则可以将其用作

SELECT * FROM tableName WHERE colName like 'test%'

这听起来像是你缺乏基础知识and/or你无法区分作用域

SELECT col
  FROM tab
 WHERE col= 'with\nlinebreak';

SELECT col
  FROM tab
 WHERE REGEXP_LIKE( col, 'with.linebreak', 'in' )= 1;

你的输入有问题吗?转义换行符。 table 内容有问题吗?使用 REGEXP_LIKE 来克服换行符。您要在 table 可能没有换行符的内容中搜索可能有换行符的短语吗?将您的输入转换为正则表达式。参见 https://dev.mysql.com/doc/refman/8.0/en/regexp.html#function_regexp-like

编辑:PHP (PDO) 方面的示例:

$sql= 'SELECT col FROM tab WHERE col= :input';
$sth= $dbh-> prepare( $sql, array( PDO:: ATTR_CURSOR=> PDO:: CURSOR_FWDONLY ) );

$sth-> execute( array( ':input'=> 'this
linebreak works' ) );  // But the linebreak is how you save this file

$sth-> execute( array( ':input'=> 'this\nlinebreak works' ) );  // Unbound to how you save this file

这仍然无法解决其他问题,例如如何在数据库中保存换行符:它可能是 \n\r\r\n,并且因为您需要完全匹配你真的只明白了。

我发现 SELECT 找到行 仅当 该行的内容被保存并用 \n 替换换行符,回车 return 与 \r 和选项卡与 \t.

例如 PHP:

$text = str_replace(array("\n", "\r", "\t", "'", "\"), array("\n", "\r", "\t", "''", "\\"), $text;
$query = "INSERT INTO tableName SET colName = '$text'";
...

通过这样做,它应该独立于OS运行MySQL。

注意:这只是解释为什么SELECT在数据库中找不到行,考虑到查询中输入的每条数据都必须首先已清理以防止错误或 SQL 注入!