J. Mini Asked: 2024-01-06 03:21:31 +0800 CST2024-01-06 03:21:31 +0800 CST 2024-01-06 03:21:31 +0800 CST 将字符串截断为 100 个字节对的惯用方法是什么? 772 nvarchar(100)保存 100 个字节对,如此处所述。LEFT([Your String], 100)将字符串截断为 100 个字符,如此处所述。这些不一样。 愚蠢的是,我使用了LEFT([Your String], 100)希望保持[Your String]在nvarchar(100). 正确解决这个问题的惯用方法是什么?我考虑过使用CAST,但我对隐式截断字符串感到不舒服。 sql-server 1 个回答 Voted Best Answer Marcelo Estriga 2024-01-06T04:55:04+08:002024-01-06T04:55:04+08:00 如果您可以确定[Your String]使用的是非 SC 排序规则,则可以互换使用LEFT([Your String], 100)和CAST([Your String] as nvarchar(100)),因为在非 SC 排序规则中,每个字节对代表一个字符(代理字符代表它们自己)。 无论是否[Your String]使用 SC 排序规则(如果代理字符要表示除自身以外的任何内容,则应该如此),CAST([Your String] as nvarchar(N))都不会在表示字符的字节序列中间执行截断(其中此类字节的解释作为单个字符的序列由当前排序规则确定)。您可以通过运行以下代码并检查其输出来确认这一点。 WITH cte as ( SELECT N'𝟠' COLLATE Latin1_General_100_CI_AS_SC [SC String], N'𝟠' COLLATE Latin1_General_100_CI_AS [non-SC String] ) SELECT DATALENGTH(CAST([SC String] as nvarchar(1))) [SC DataLength], DATALENGTH(CAST([non-SC String] as nvarchar(1))) [non-SC DataLength] FROM cte 在一般情况下,CAST这是要走的路。
如果您可以确定
[Your String]
使用的是非 SC 排序规则,则可以互换使用LEFT([Your String], 100)
和CAST([Your String] as nvarchar(100))
,因为在非 SC 排序规则中,每个字节对代表一个字符(代理字符代表它们自己)。无论是否
[Your String]
使用 SC 排序规则(如果代理字符要表示除自身以外的任何内容,则应该如此),CAST([Your String] as nvarchar(N))
都不会在表示字符的字节序列中间执行截断(其中此类字节的解释作为单个字符的序列由当前排序规则确定)。您可以通过运行以下代码并检查其输出来确认这一点。在一般情况下,
CAST
这是要走的路。