【问题标题】:Store real line break in db在数据库中存储真正的换行符
【发布时间】:2014-09-06 20:36:23
【问题描述】:

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

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

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

如果我像这样 var_dump 我的结果:

var_dump(unpack('C*',$eol));

结果是:

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

其实是这样的:

  • [反斜杠]
  • r
  • [反斜杠]
  • n

如果我 var_dump 一个真正的换行符

var_dump(unpack('C*',"\r\n"));

结果是:

array(2) { 
[1]=> int(13) 
[2]=> int(10) 
} 

如何在 mysql 中正确存储真正的换行符?

编辑:

@all 如果我做的很简单

var_dump("\r\n");

它会像这样显示:

string(2) "
"

这很好,但我看不到真正的字符!

【问题讨论】:

  • 我从来没有遇到过你的问题。假设您有一个文本区域和换行符。您只需将它们按原样保存在数据库中并使用nl2br 显示它们。就是这样。
  • @machineaddict 不适用于这种情况。我需要将换行信息存储在一个单独的字段中,以便能够解析具有不同换行符的 CSV 文件。
  • 你输入\r\n作为默认值,会不会是phpmyadmin转义了这个值?
  • 那么当你将它们保存为字符串\r\n时,你为什么要unpack
  • 出于调试原因,我正在解包以便能够看到真正的字符。

标签: php mysql line-breaks


【解决方案1】:

您不需要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

【讨论】:

  • 如果我使用 2 字节二进制字段 PHPMyAdmin 显示:字段 eol 的默认值无效 \r\n。它将其处理为 4 个字节。
  • 当通过 phpMyAdmin 输入 \r\n 时,这是 4 个字节的文字,因为 phpMyAdmin 会转义字符。您不能使用 phpMyAdmin 插入它。它将\r\n 更改为\\r\\n。 phpMyAdmin 设置的默认值也被转义。您需要通过查询来生成整个表。
  • 好吧,你是对的。这是一个 PHPMyAdmin 问题。我删除了默认值并将其插入到我的记录中(字段类型:Varchar)。结果是我在执行var_dump(unpack('C*',$eol));! 时收到了正确的换行符array(2) { [1]=> int(13) [2]=> int(10) }!。
  • 对不起,你帮助了我,但我不得不接受@nightgaunt 的回答。它直接指出了问题所在。 “你不需要解包”提示和“2 字节二进制”提示并没有解决问题。通过查询插入解决了这个问题。不过非常感谢。
  • @steven 我最后一次编辑,指出 phpMyAdmin 转义换行符是 32 分钟前,而 nightgaunt 的回答是 25 分钟前。无论如何,我对你的决定很好,我不会把这个私人的或太严肃的抱怨:-) 很高兴你的问题得到了解决!
【解决方案2】:

问题不在于 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');

按预期工作。

【讨论】:

  • 是的,我也意识到了这一点。默认值不起作用。我删除了它并通过查询插入了值,一切正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
相关资源
最近更新 更多