gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:36:18 26 4
gpt4 key购买 nike

让我们有一个相当简单的 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 的输出是 name 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")
)

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

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

编辑:
使用 MarkLogic 9.0-7.2 .

最佳答案

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

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

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

关于MarkLogic sql S1 排序规则显示错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53501629/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com