如何在SQL Server中获取与PHP strlen一致的Unicode字符串实际长度?
搞定SQL Server和PHP字符串长度匹配的问题
嘿,这个差异我太熟了!本质是PHP和SQL Server对“长度”的定义完全不一样,我给你一步步说清楚:
为啥结果差这么多?
- PHP的
strlen():它算的是字节数!你这段孟加拉语是UTF-8编码的,每个字符要占3-4个字节,加起来总字节数就是222。 - SQL Server的
LEN():它只算字符个数,不管每个字符占多少字节,你数一下这段文本的字符(包括那个竖线和句号)刚好是36个,所以返回36。
怎么在SQL Server里拿到222这个结果?
你需要用SQL Server的DATALENGTH()函数,但得分两种情况:
情况1:你的数据库是SQL Server 2019+,且字符串用UTF-8的varchar存储
直接用DATALENGTH()就行,它会返回实际的字节数:
SELECT DATALENGTH('আমার সোনার বাংলা|আমি তোমায় ভালবাসি।') AS ByteLength;
执行这个就能得到和PHP strlen()一模一样的222。
情况2:字符串是存成nvarchar(Unicode UTF-16格式)
这时候DATALENGTH()会返回72(因为每个nvarchar字符占2字节,36*2=72),不是我们要的。得先把它转成UTF-8编码的varchar,再统计:
SELECT DATALENGTH(CONVERT(varchar(MAX), 'আমার সোনার বাংলা|আমি তোমায় ভালবাসি।', 65001)) AS ByteLength;
这里的65001是UTF-8的代码页编号,转完之后再统计字节数就得到222了。
一句话总结
要匹配PHP的strlen(),SQL Server就得统计UTF-8编码下的总字节数,用DATALENGTH()配合正确的编码转换就行~
内容的提问来源于stack exchange,提问作者riad
相关产品推荐
相关产品推荐

