【问题标题】:How to check actual unicode string length in SQL Server如何在 SQL Server 中检查实际的 unicode 字符串长度
【发布时间】:2018-01-15 11:46:42
【问题描述】:

如果我们在 PHP 中检查以下字符串,结果如下所示

echo $Length=strlen('আমার সোনার বাংলা|আমি তোমায় ভালবাসি।'); 输出:222

但是当我们在 SQL Query 中检查相同的字符串时,输出会显示 36 个字符长。

选择 LEN ('আমার সোনার বাংলা|আমি তোমায় ভালবাসি।') 长度:36

我们如何在 MS-SQL Query 中测量实际字符 222 的长度??

【问题讨论】:

标签: php sql-server unicode


【解决方案1】:

根据Microsoft Docs LENLEN会返回字符串的长度。

如果要获取字符串的字节,需要根据Microsoft Docs DATALENGTHDATALENGTH

其他信息

MySQL 的等效项是:

根据MySQL Docs LENGTH LENGTH 用于字符大小和字节。
根据MySQL Docs CHAR_LENGTH CHAR_LENGTH 用于“计算”结果的长度,忽略字节长度。这会将 4 字节字符视为 1 长度。

【讨论】:

  • 感谢您的回答。但 DATALENGTH 给出与 LEN 相同的输出
  • SQL Server 中的 datalen 函数报告 UTF-16 字节数,php 可能使用 UTF-8 报告 len 字节数。如果不考虑文本编码,则无法比较数据长度。
【解决方案2】:

你需要先了解unicode字符和ascii字符的区别。在您的 select 语句中,您使用的是 ascii 文字,而不是 unicode 文字。实际上,您正在使用该“测试”来测量垃圾。此外,您不会识别要使用 tsql 测量的任何值的数据类型。您的问题表明您没有在 sql server 中使用 unicode 字符串 - 这是一个大问题。正如其他人所指出的,sql server 中的 unicode 字符始终为 2 个字节。为了帮助说明 sql server 端:

set nocount on;
declare @x varchar(50), @y nvarchar(50);
set @y = N'আমার সোনার বাংলা|আমি তোমায় ভালবাসি।';
set @x = @y;

select len(@x) as xlen, len(@y) as ylen;
select datalength(@x) as xdlen, datalength(@y) as ydlen;
select @x, @y;

由于 PHP 中的 strlen 返回字节数,并且由于 PHP 使用不同类型的 unicode 编码,因此您的目标是不可能的。也许您应该计算字符而不是字节?赞this

【讨论】:

  • 每个孟加拉语字母在 UTF-8(MySQL 的 utf8 或 utf8mb4)中占用 3 个字节。单词之间的空间占用 1 个字节。
猜你喜欢
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 2014-06-23
  • 2017-07-26
  • 1970-01-01
  • 2015-06-23
相关资源
最近更新 更多