Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL选择不适用于包含换行符的文本_Mysql_Select_Encoding_Special Characters_Where Clause - Fatal编程技术网

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

MySQL选择不适用于包含换行符的文本,mysql,select,encoding,special-characters,where-clause,Mysql,Select,Encoding,Special Characters,Where Clause,我正在尝试使用PHP的PDO在表中搜索文本是否已经存在 问题是,如果文本包含换行符,MySQL在表中找不到该行 我的问题是: SELECT * FROM tableName WHERE colName = 'test other chars \\ '' " _ \% àèìòù' 如果我删除新行,它将找到该行 编辑: 我发现,SELECT仅当保存该行的内容时才查找该行,并将换行符替换为\n,回车符替换为\r,制表符替换为\t 例如,使用PHP: $text = str_replace(arra

我正在尝试使用PHP的PDO在表中搜索文本是否已经存在

问题是,如果文本包含换行符,MySQL在表中找不到该行

我的问题是:

SELECT * FROM tableName WHERE colName = 'test
other chars \\ '' " _ \% àèìòù'
如果我删除新行,它将找到该行

编辑


我发现,
SELECT
仅当保存该行的内容时才查找该行,并将换行符替换为
\n
,回车符替换为
\r
,制表符替换为
\t

例如,使用
PHP

$text = str_replace(array("\n", "\r", "\t", "'", "\\"), array("\\n", "\\r", "\\t", "''", "\\\\"), $text;
$query = "INSERT INTO tableName SET colName = '$text'";
...
$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%'

这听起来像是您缺乏基本知识和/或无法区分范围

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

SELECT col
  FROM tab
 WHERE REGEXP_LIKE( col, 'with.linebreak', 'in' )= 1;
你的意见是问题所在吗?避开新词。表格内容是问题所在吗?像一样使用
REGEXP\u克服换行符。是否要在可能没有换行符的表内容中搜索可能有换行符的短语?将输入转换为正则表达式。看

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


这仍然无法解决其他问题,例如如何在数据库中保存换行符:它可能是
\n
\r
\r\n
,因为你想要一个精确的匹配,所以你实际上只能得到它。

我发现,
选择
仅当该行的内容被保存时才能找到该行,并将换行符替换为
\n
,回车符替换为
\r
,制表符替换为
\t

例如,使用
PHP

$text = str_replace(array("\n", "\r", "\t", "'", "\\"), array("\\n", "\\r", "\\t", "''", "\\\\"), $text;
$query = "INSERT INTO tableName SET colName = '$text'";
...
$text = str_replace(array("\n", "\r", "\t", "'", "\\"), array("\\n", "\\r", "\\t", "''", "\\\\"), $text;
$query = "INSERT INTO tableName SET colName = '$text'";
...
通过这样做,它应该独立于MySQL在哪个操作系统上运行


<强>注释:这只是解释为什么SELECT找不到数据库中的行,考虑到在查询中输入的每个数据必须首先被清除以防止错误或SQL注入! 在WHERE子句中使用正则表达式不会破坏列中的内容!它只查看要应用regex@RiggsFolly我知道。。。我的意思是,为了不被视为正则表达式(es.[],-,)等的字符,我必须避开搜索文本中的许多字符。这与PHP无关,很可能甚至与MySQL无关。删除这些标记。@AmigoJack PHP信息很重要,因为它可能是问题的原因,例如编码、PHP PDO等声音,例如文本来自一个操作系统,而您的程序正在另一个操作系统上运行。(Windows:\r\n,Unix:\n,Max:\r)\这是另一回事。这不是我要找的。请仔细阅读我的问题。你几秒钟前编辑了这个问题。重新思考你到底在寻找什么。即使在我更改我的问题之前,你的答案也不正确。我要求提供搜索精确文本的解决方案,因此我无法使用你的解决方案:

匹配每个字符。你不明白:交给“精确”文本没有问题,但您现在使用的是SQL—在SQL中,您必须以文本形式转义所有换行符。这就是范围冲突的地方。如果您使用PHP的PDO,那么请提供该代码作为示例。我尝试在输入文本中用
\n
替换换行符,用
\r
替换回车符,用
\t
替换制表符(选择中的值),但只有当我删除所有
\r\n
时,它才会起作用。。。我做错了什么?我必须检查什么才能使其工作?否:在MySQL和PHP中使用
\n
具有相同的结果,但范围很重要-要使该掩码从PHP转换为SQL(因此SQL解释它),您必须执行
$string='SELECT\'\\n\'$string='SELECT\'\n\'-您不必在这两个方面都做,您“只是”必须了解在哪里发生了什么。正如我之前所写的:这只是SQL,在SQL中不能有带换行符的文本。但是如果您使用PDO(如您所写)并使用参数绑定,那么您就不必关心这些问题。请参阅我的PHP代码示例。你的整个问题都是从为什么SQL不能处理文本中的换行开始的。我可以在MySQL中存储一个文本换行符,方法是像这样转义“\”:
\\n
选择“撇号中包含的文本是文本”
而不是
$php=”撇号中包含的文本是文本,但在php中可以有文本中的换行符“-您仍然无法区分两者,因此您的总体问题。我理解。没错,我用错了术语
literal