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")
)
出于某种原因,这现在也输出大写 T
的 Test
。
为什么会这样? doc("/test/1.xml")
的输出确实显示了正确的文档:
<test>
<name>test</name>
</test>
这是正确的行为吗?排序规则不仅会影响比较(如在 where 子句中),还会影响摄取吗?有没有办法让区分大小写的数据和不区分大小写的比较?
编辑:
使用 MarkLogic 9.0-7.2
.
发生这种情况是因为三重索引将唯一值存储在值字典中以进行压缩。由于 "test" 和 "Test" 在排序规则下被认为是相等的,因此只有一个值将存储在值字典中 - 在这种情况下 "Test".
通过使用不区分大小写和变音符号的排序规则,您实际上是在说您不关心大小写和变音符号的差异。这意味着您不应该关心该列 returned 值中使用的大小写或变音符号。
如果您有一个用例来检索原始文档中显示的确切字符串,请添加两列 - 一列区分大小写和变音符号,另一列使用默认代码点排序规则。使用前者搜索,但 return 结果来自后者。
让我们有一个相当简单的 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")
)
出于某种原因,这现在也输出大写 T
的 Test
。
为什么会这样? doc("/test/1.xml")
的输出确实显示了正确的文档:
<test>
<name>test</name>
</test>
这是正确的行为吗?排序规则不仅会影响比较(如在 where 子句中),还会影响摄取吗?有没有办法让区分大小写的数据和不区分大小写的比较?
编辑:
使用 MarkLogic 9.0-7.2
.
发生这种情况是因为三重索引将唯一值存储在值字典中以进行压缩。由于 "test" 和 "Test" 在排序规则下被认为是相等的,因此只有一个值将存储在值字典中 - 在这种情况下 "Test".
通过使用不区分大小写和变音符号的排序规则,您实际上是在说您不关心大小写和变音符号的差异。这意味着您不应该关心该列 returned 值中使用的大小写或变音符号。
如果您有一个用例来检索原始文档中显示的确切字符串,请添加两列 - 一列区分大小写和变音符号,另一列使用默认代码点排序规则。使用前者搜索,但 return 结果来自后者。