什么是纯文本数据库文件的最佳分隔符/定界符字符?

78

什么是纯文本数据库文件的最佳分隔符/定界符?

我考虑使用 |、,、、; 等字符,但它们似乎都可能在附近的条目具有特殊字符时出现问题。

因此,有经验的数据库用户,你建议使用哪个分隔符字符?


2
如果我使用两个或更多特殊字符的组合作为分隔符,那会怎样呢?破坏我的结构的机会会减少,而且这也很简单。 - Iqra.
12个回答

66

在 US-ASCII 中,有几个分隔符 字符,十六进制代码为 1c1d1e1f。纯文本中不应包含它们。

1c  FS  ␜  ^\  File Separator
1d  GS  ␝  ^]  Group Separator
1e  RS  ␞  ^^  Record Separator
1f  US  ␟  ^_  Unit Separator

7
实质上,这就是它们的作用,如果这成为标准将会很好。但是这方面存在一些问题。并非所有数据库技术的导入/导出工具都支持非可打印分隔符,例如 SQL Server 的 bcp。https://dba.stackexchange.com/questions/208982/use-non-printable-characters-in-sql-server-bcp-xml-format-file-as-terminator - Wouter
1
此外,如果您的源数据存在编码问题,则数据可能已经包含了这些字节序列。要确保的唯一方法是首先搜索整个数据集以查找您计划使用的分隔符。 - Wouter
如果你想使用它们,需要可打印字符并且可以使用Unicode,那么Unicode的“控制图片”块(U+2400到U+243F)具有这四个字符和转义字符的符号。 - Simon G.

49
无论您选择哪个字符作为分隔符,都需要转义数据中该字符的任何实例。 也许是波浪号(~),或者使用高ASCII字符。 无论哪种方式,如果它有机会混入您的数据中,您都需要在写入纯文本文件之前对其进行转义。

5
逃逸是唯一的解决方案,可以在数据中包含任何字符。我通常更喜欢使用管道符“|”(以及\|\\作为转义符),但波浪号与其他任何字符一样好用。 - paxdiablo
5
这是一个实际问题。我有一次选择分隔符字符或字符串的自由,但我无法控制数据库单元格中可能出现的内容。在这种情况下,我想要选择一个会有很小概率产生错误的分隔符字符/字符串。 - Meng Lu
18
如果你不知道你的数据是什么,那么你就不能选择分隔符。任何分隔符都可能会出错。实际上:你面临的问题是欠约束的,没有正确答案。 - Chris Subagio
1
有人能具体说明一下什么是高ASCII字符吗? - Iqra.
4
ASCII 只包含 127 个字符,但是“High-ASCII”或“扩展 ASCII”则包含了 255 个字符。详见 https://en.wikipedia.org/wiki/Extended_ASCII 。(迟做总比不做好。) - henrycjc
@henrycjc 是的,我已经得到了答案,之后再次感谢 :-) - Iqra.

40

我认为最好的连接字符串的方法是使用三个樱桃符号“@@@”。


17
意大利语中,人们称它们为“chiocciola”或者“snails”。 - thermite
17
缺乏解释或论证,所以我会给你投下反对票。那么,有什么使得“@@@”与任何其他随意的字符串或字符不同呢? - Wouter
5
@Wouter 符号 "@" 在视觉上非常突出,占据比其他常见符号字符更多的空间(在大多数常见字体中)。在真实数据中,单个 at 符号非常普遍(作为电子邮件地址),双重 at 符号也很常见(电子邮件地址的打字错误)。三个 at 符号不太可能出现,并且在调试/测试/审计字符转义时很容易发现(与例如换行符、空格、制表符、逗号、和符号相比)。 - Max Terry
可能会提供解释,但仍取决于您放入的数据类型。如果您拥有原始数据集合,无论您选择什么分隔符,都很难获得正确格式的数据。对于一般用途,字母的组合可以很好地解决问题。 - Rajan Chauhan
3
顺便说一句,在奥地利,我们称 @ 符号为“Klammeraffe”或蜘蛛猴。很容易理解为什么这样称呼它。 - Stefan Haberl
2
如果它必须匹配超过1个字符,那么这是否会导致big(O)性能下降? - Fiddle Freak

17
在一个数据仓库的特定情况下,我们可以控制源文件,但转义和限定很费力。我们能够做出业务决策,即如果特殊ASCII字符未出现(目前还没有出现),则从数据中删除一个扩展ASCII字符。
在创建分隔符源文件时,我们会从数据中剥离出任何██ (alt+219) 的实例,并使用该字符作为分隔符。额外的好处是,这个字符很容易识别。

这个字符很好用,因为我不认为有人会有意地在输入文本框中输入它。 - Aleister Tanek Javas Mraz

11

实际上,这取决于您要分离的数据类型,我们需要一种分隔符来处理机器事件数据,有几个提议:

=) 或者 ^_^

我们选择了 ^_^,因为它在测试样本数量上实际有效,并且看起来很可爱!


单个分隔符字符不是推荐使用的吗? - alper
@alper 的想法是确保分隔符不包含在实际数据中。 - Coder Absolute
1
同时,在zsh中不使用作为文件名的分隔符:zsh:在文件名中使用分隔符时解析错误附近的 - alper

5

我通常喜欢使用像"\u0001"这样的不可打印字符,例如在大多数Azure Data Analytics U-SQL脚本中,我将其用作列分隔符。这是基于您可以使用多字符自定义分隔符的假定。


4
您可以使用特殊的分隔符字符(十六进制1c->1f),但它们是不可打印的,而且某些技术在处理包含这些字符的数据时会出现问题。所以,如果您的数据是UTF-8编码,计划B是选择一个随机的UTF-8字符,这个字符极不可能出现在您接收到的任何源数据中。但即使如此,如果您想确保不会遇到问题,最好始终扫描整个数据集以查找此字符,如果出现,请选择另一个UTF-8字符。我倾向于非常讨厌封装,并尽可能避免使用它,正如我在这里“封装”章节下的文章中所解释的那样:https://theonemanitdepartment.wordpress.com/2014/12/15/the-absolute-minimum-everyone-working-with-data-absolutely-positively-must-know-about-file-types-encoding-delimiters-and-data-types-no-excuses/

4

个人而言,我喜欢使用“«”作为CSV文件中分隔数据的定界符,我个人认为我从未发现过自然存在的“«”和“»”,所以这是我的建议。


16
双尖括号(«»)在多种语言中用作“引号”,最常见的是在法语和意大利语中使用。 - Juha Untinen
2
它在中文书名中是常用的。 - Daolin

1

如果您无法控制输入的数据,请不要使用纯文本数据库。这里没有普遍正确的答案。没有上下文或限制,这是一个错误的问题。

换句话说: 如果我说我只接受小写字母作为数据,我可以使用任何其他符号作为分隔符。甚至,比如数字9,我也没问题。除了小写字符之外,没有任何符号比其他符号更好。

相反地,如果我说我可以接受任何字符,那么我就没有任何字符可以用作分隔符了,我只能留下一个非常抱歉的数据库,只能存储单个值。

如果您必须费尽心思将您的数据库转换成纯文本格式,那么您可能需要一个二进制数据库。您看过sqlite吗?它非常容易使用,在许多情况下都可用,并且比纯文本数据库具有许多优点。


0
如果您可以选择字符串作为列分隔符,请使用 "" 作为定界符。您可以自己编造任何字符串,这样可以提高灵活性。

这应该是一个注释。 - ρяσѕρєя K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接