【问题标题】:MySQL 5.6, how to export NULL as \N?MySQL 5.6,如何将 NULL 导出为 \N?
【发布时间】:2017-02-04 10:55:47
【问题描述】:

我正在将 MySQL 5.5 物理主机数据库迁移到 MySQL 5.6 AWS Aurora 数据库。我注意到当使用INTO OUTFILE 将数据写入文件时,5.5 将NULL 值写入'\N' 并将空字符串写入''。但是,5.6 将空字符串和 NULL 都写为''

查询

SELECT * FROM $databasename.$tablename INTO OUTFILE $filename CHARACTER SET utf8 FIELDS ESCAPED BY '\\\\' TERMINATED BY $delimiter;

我找到了关于这个的官方文件:

https://dev.mysql.com/doc/refman/5.6/en/load-data.html

采用固定行格式(当 FIELDS TERMINATED BY 和 FIELDS ENCLOSED BY 都是空的),NULL 写为空 细绳。这会导致表中的 NULL 值和空字符串 写入文件时无法区分,因为两者都被写入 作为空字符串。如果您需要能够在何时区分两者 重新读取文件,您不应该使用固定行格式。

如何将NULL 导出为'\N'

【问题讨论】:

  • 你确定你不是指\N for null(没有'')吗?这将是 5.5 和 5.6 的默认行为,对于文档中引用的情况,5.5 和 5.6 也将为空。您是否有任何机会使用不同的$delimiter?如果它是空的,它会为null'' 产生“nothing”,就像引用所说的那样。您是否在文件中获得了'\N',或者在您重新导入它(并且可能再次重新导出它)后在您的数据库中获得了'\N' - 那么您可能导入不正确。

标签: mysql mysql-5.6 mysql-5.5 into-outfile amazon-aurora


【解决方案1】:

如何将NULL 导出为'\N'

首先这很奇怪,你为什么要这样做?但是,如果由于某种原因您想以这种方式导出它,那么您将不得不将您的查询从 select * 更改为使用 CASE 表达式,例如

select 
case when col1 is null then '\\N' else col1 end as col1,
...
from $databasename.$tablename....

正如评论所言,您也可以将IFNULL() 函数或COALESCE() 函数用于相同目的。

【讨论】:

  • 当 col1 为 null 然后 '\N' else col1 以 col1 结束 === ifnull(col1, '\N') AS col1 时的情况
  • 我怀疑 OP 想要返回两个字符,一个反斜杠字符和一个 N,而不是一个换行符。要返回包含反斜杠和 N... 字符串文字的字符串需要:'\\N'
  • @SIDU,确实是这样。感谢您注意到这一点。
  • @spencer7593 正确
  • @Rahul 我想将NULL 导出为'\N',因为我不想破坏对5.5 数据的任何依赖。从概念上讲,这对我来说也很有意义:NULL 和空字符串不一样,那么为什么要将它们导出为相同的呢?
猜你喜欢
  • 2012-11-18
  • 2014-08-15
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
相关资源
最近更新 更多