MarkLogic sql S1 排序规则显示错误值

MarkLogic sql S1 collation showing wrong values

让我们有一个相当简单的 TDE 模式:

<tde:template xmlns:tde='http://marklogic.com/xdmp/tde'>
  <tde:description>testing a TDE view</tde:description>
  <tde:context>/test</tde:context>
  <tde:enabled>true</tde:enabled>
  <tde:rows>
    <tde:row>
      <tde:schema-name>sitefusion</tde:schema-name>
      <tde:view-name>test</tde:view-name>
      <tde:columns>
        <tde:column>
          <tde:name>name</tde:name>
          <tde:scalar-type>string</tde:scalar-type>
          <tde:val>name</tde:val>
          <tde:nullable>false</tde:nullable>
          <tde:collation>http://marklogic.com/collation/en/S1</tde:collation>
        </tde:column>
      </tde:columns>
    </tde:row>
  </tde:rows>
</tde:template>

此架构具有排序规则 http://marklogic.com/collation/en/S1,表示它是 case and diacritic insensitive。考虑到这一点,我插入了一个带有第一个字符大写名称 Test:

的测试文档
let $doc := 
<test>
  <name>Test</name>
</test>
return xdmp:document-insert("/test/1.xml", $doc);

let $data := xdmp:sql("select name from test")

return json:array-pop($data)[2];

该 xquery 的输出是名称 Test 的期望值。

现在让我们更新 name 并在其中放入一个小写的 test:

let $doc := 
<test>
  <name>test</name>
</test>
return xdmp:document-insert("/test/1.xml", $doc);

let $data := xdmp:sql("select name from test")

return (
   json:array-pop($data)[2], 
   doc("/test/1.xml")
)

出于某种原因,这现在也输出大写 TTest。 为什么会这样? doc("/test/1.xml") 的输出确实显示了正确的文档:

<test>
      <name>test</name>
</test>

这是正确的行为吗?排序规则不仅会影响比较(如在 where 子句中),还会影响摄取吗?有没有办法让区分大小写的数据和不区分大小写的比较?

编辑: 使用 MarkLogic 9.0-7.2.

发生这种情况是因为三重索引将唯一值存储在值字典中以进行压缩。由于 "test" 和 "Test" 在排序规则下被认为是相等的,因此只有一个值将存储在值字典中 - 在这种情况下 "Test".

通过使用不区分大小写和变音符号的排序规则,您实际上是在说您不关心大小写和变音符号的差异。这意味着您不应该关心该列 returned 值中使用的大小写或变音符号。

如果您有一个用例来检索原始文档中显示的确切字符串,请添加两列 - 一列区分大小写和变音符号,另一列使用默认代码点排序规则。使用前者搜索,但 return 结果来自后者。