Internaly,Postgre如何存储XML数据?

时间:2017-06-20 23:54:37

标签: xml oracle postgresql storage

当Oracle将XML存储为二进制数据时,它将在没有XML标记的情况下存储。 我们在这里可以看到:Oracle Patent

这种机制允许Oracle在存储XML数据时消耗更少的内存。

我想知道PostgreSQL如何存储其XML数据。 我找到了这个文档,其中说内部Postgre将通过UTF-8将XML作为字符串处理(如果它被配置为通过另一个标准处理数据,许多函数不起作用):Postgre Documentation

我没有找到任何能说明Postgre如何存储其二进制XML数据的内容...... 由于它没有通过DTD(Postgre Documentation)验证XML输入数据,我认为它确实存储了所有文档的所有XML标记。

有没有人确切知道或者有更准确的引用说明Postgre如何存储XML数据? - 如果它没有像Oracle这样的标签存储,或者存储了所有文档的所有XML标签。

提前致谢...

1 个答案:

答案 0 :(得分:3)

存储为UTF-8字符串。

摘自来源:

    /*
     * Parse the data to check if it is well-formed XML data.  Assume that
     * xml_parse will throw ERROR if not.
     */
    doc = xml_parse(result, xmloption, true, encoding);
    xmlFreeDoc(doc);

    /* Now that we know what we're dealing with, convert to server encoding */
    newstr = pg_any_to_server(str, nbytes, encoding);

xml.c via github

基本上postgres检查xml字符串是否有效,然后按原样存储它。

来自pg_any_to_server:

/*
 * Convert any encoding to server encoding.
 *
 * See the notes about string conversion functions at the top of this file.
 *
 * Unlike the other string conversion functions, this will apply validation
 * even if encoding == DatabaseEncoding->encoding.  This is because this is
 * used to process data coming in from outside the database, and we never
 * want to just assume validity.
 */
char *
pg_any_to_server(const char *s, int len, int encoding)
{

mbutils.c via github

因此,它被格式化为UTF-8字符串,然后像postgres一样存储,就像任何字符串一样。