按照微软SQL Server的新版本2014中有XQuery
在使用substring
function的差:在SQL Server 2008和2014之间使用XQuery函数substring()有什么区别?
如果兼容级别是110或更高,每个代理对被计数为单个字符。对于较早的兼容级别,它们被计为两个字符。
“代理对”在这里意味着什么?请给出一些示例来解释SQL Server中的这一新功能。
按照微软SQL Server的新版本2014中有XQuery
在使用substring
function的差:在SQL Server 2008和2014之间使用XQuery函数substring()有什么区别?
如果兼容级别是110或更高,每个代理对被计数为单个字符。对于较早的兼容级别,它们被计为两个字符。
“代理对”在这里意味着什么?请给出一些示例来解释SQL Server中的这一新功能。
我期望它指UTF-16代理对,其中两个代码单元(范围为0xD800到0xDFFF)编码U + 10000到U + 10FFFF范围内的单个字符。
我将您引用的语句解释为意味着早期版本将每个代码点解释为单个字符,即使它实际上是单个字符的一半。
使用例如从Wikipedia,(
U+10437
)被编码为两个码点D801DC37。较老的服务器会将每个代码点视为它自己的一个字符,并且substring
甚至可能将这两个代码点分开。
举一个具体的例子,考虑"abcd"
找到第三个字符:
substring("abcd", 2, 1)
老服务器将作为两个独立的字符,所以结果是
"a"
。 (D801DC37一个bÇd)。
较新的服务器将识别为单个不可分割的字符,结果为
"b"
。 (一个bÇd)。
我不清楚这个代理对。如果通过一些例子来解释会很好。 – Gooks
感谢@Toby Speight,它似乎是SQL 2008中的一个bug,而它已经在SQL 2014中得到解决,因为现在计算字符位置的精度对于UTF-16更精确。 – Gooks
@Gooks如果这回答您的问题令您满意,您应该检查答案旁边的✔,而不是留下“谢谢”评论。阅读更多关于这个礼仪[这里](https://stackoverflow.com/help/someone-answers)。 –