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 注入!
如果文本已经存在,我正在尝试使用 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 注入!