Php 以db存储实际线路中断

Php 以db存储实际线路中断,php,mysql,line-breaks,Php,Mysql,Line Breaks,我的mysql数据库中有一个名为eol(type:varchar)的字段 我在PHPMyAdmin中将其设置为默认值\r\n 如果我使用PDO执行选择,我不会收到真正的换行符 如果我像这样转储我的结果: var_dump(unpack('C*',$eol)); string(2) " " 结果是: array(4) { [1]=> int(92) [2]=> int(114) [3]=> int(92) [4]=> int(110) } 事实上: [反

我的mysql数据库中有一个名为eol(type:varchar)的字段

我在PHPMyAdmin中将其设置为默认值\r\n

如果我使用PDO执行
选择
,我不会收到真正的换行符

如果我像这样转储我的结果:

var_dump(unpack('C*',$eol));
string(2) "
"
结果是:

array(4) { 
[1]=> int(92) 
[2]=> int(114) 
[3]=> int(92) 
[4]=> int(110) 
} 
事实上:

  • [反斜杠]
  • r
  • [反斜杠]
  • n
如果我倒了一个真正的断线

var_dump(unpack('C*',"\r\n"));
结果是:

array(2) { 
[1]=> int(13) 
[2]=> int(10) 
} 
如何在mysql中正确存储真正的换行符

编辑:

@如果我做的很简单

变量转储(“\r\n”)

它将显示如下:

var_dump(unpack('C*',$eol));
string(2) "
"

这很好,但我看不到真正的角色

您不需要
pack
,使用双引号时会解析特殊字符:

var_dump("\r\n"); // 2 bytes CR LF, not 4 byte '\r\n' literal
您可能应该在MySQL中使用一个2字节的二进制字段,而不是varchar

$dbh->query("INSERT INTO x SET eol = '\r\n'");

通过phpMyAdmin插入
\r\n
,它会将字符转义到
\\r\\n
您不需要
pack
,使用双引号时会解析特殊字符:

var_dump("\r\n"); // 2 bytes CR LF, not 4 byte '\r\n' literal
您可能应该在MySQL中使用一个2字节的二进制字段,而不是varchar

$dbh->query("INSERT INTO x SET eol = '\r\n'");

通过phpMyAdmin插入
\r\n
,将字符转义为
\\r\\n

问题不在于mySQL数据库存储这些值的方式。PHPMyAdmin只是一个GUI工具。因此,您输入的任何内容都将被视为单个字符

一个简单的例子是ASCII码
0x0A
表示换行符,但如果使用PHPMyAdmin输入该换行符,则将获得这些字符,而不是换行符。这与那相似。我使用查询将行提要存储到mysql列中,没有任何问题

例如—

insert into `evaluation_answer_versions` (`evaluation_answers_answer_id`, `question_version_id`, `answer_text`, `score`, `hidden`) values (1, 1, "\r\nabc", 1, 'n');

正常工作。

问题不在于mySQL数据库存储这些值的方式。PHPMyAdmin只是一个GUI工具。因此,您输入的任何内容都将被视为单个字符

一个简单的例子是ASCII码
0x0A
表示换行符,但如果使用PHPMyAdmin输入该换行符,则将获得这些字符,而不是换行符。这与那相似。我使用查询将行提要存储到mysql列中,没有任何问题

例如—

insert into `evaluation_answer_versions` (`evaluation_answers_answer_id`, `question_version_id`, `answer_text`, `score`, `hidden`) values (1, 1, "\r\nabc", 1, 'n');


工作如期。

我从来没有遇到过你的问题。假设您有一个文本区域和换行符。您只需将它们保存在数据库中,就像它们一样,并用。就这样。@machineaddict这不是为了那个案子。我需要将换行符信息存储在单独的字段中,以便能够解析具有不同换行符的CSV文件。可能是phpmyadmin在您为默认值输入
\r\n
时逃逸了该值吗?那么,当您将它们保存为字符串
\r\n
时,为什么要
解包呢?我正在解包以进行调试有理由能看到真正的角色。我从来没有遇到过你的问题。假设您有一个文本区域和换行符。您只需将它们保存在数据库中,就像它们一样,并用。就这样。@machineaddict这不是为了那个案子。我需要将换行符信息存储在单独的字段中,以便能够解析具有不同换行符的CSV文件。可能是phpmyadmin在您为默认值输入
\r\n
时逃逸了该值吗?那么,当您将它们保存为字符串
\r\n
时,为什么要
解包呢?我正在解包以进行调试能够查看实际字符的原因。如果使用2字节二进制字段PHPMyAdmin,则显示:字段eol的默认值无效\r\n。它将其处理为4个字节。通过phpMyAdmin输入
\r\n
时,这是4个字节的文本,因为phpMyAdmin会转义字符。无法使用phpMyAdmin插入此文件。它将
\r\n
更改为
\\r\\n
。phpMyAdmin设置的默认值也被转义。您需要通过查询生成整个表。好的,您是对的。这是一个PHPMyAdmin问题。我删除了默认值并将其与我的记录(Fieldtype:Varchar)一起插入。结果是,在执行
var_dump(unpack('C*',$eol')时,我收到了一个正确的换行符
array(2){[1]=>int(13)[2]=>int(10)}
!。对不起,你帮了我,但我不得不接受@nightgaunt的回答。它直接指向了这个问题。“您不需要解包”提示和“2字节二进制”提示没有解决问题。通过查询插入解决了这个问题。不过,非常感谢。@steven我上次编辑时指出,phpMyAdmin逃逸新行字符是32分钟前,而nightgaunt的答案是25分钟前。不管怎么说,我对你的决定很满意,我不认为这是针对个人的,也不太严肃地抱怨:-)很高兴你的问题解决了!如果使用2字节二进制字段,PHPMyAdmin将显示:字段eol的默认值无效\r\n。它将其处理为4个字节。通过phpMyAdmin输入
\r\n
时,这是4个字节的文本,因为phpMyAdmin会转义字符。无法使用phpMyAdmin插入此文件。它将
\r\n
更改为
\\r\\n
。phpMyAdmin设置的默认值也被转义。您需要通过查询生成整个表。好的,您是对的。这是一个PHPMyAdmin问题。我删除了默认值并将其与我的记录(Fieldtype:Varchar)一起插入。结果是,在执行
var_dump(unpack('C*',$eol')时,我收到了一个正确的换行符
array(2){[1]=>int(13)[2]=>int(10)}
!。对不起,你帮了我,但我不得不接受@nightgaunt的回答。它直接指向了这个问题。“您不需要解包”提示和“2字节二进制”提示没有解决问题。通过查询插入解决了这个问题。不过,非常感谢。@steven我上次编辑时指出,phpMyAdmin逃逸新行字符是32分钟前,而nightgaunt的答案是25分钟前。不管怎么说,我对你的决定很满意,我不认为这是针对个人的,也不太严肃地抱怨:-)很高兴你的问题解决了!是的,我也认识到了。默认值不起作用。我把它取了下来,把它镶了进去