我需要在SQL Server中签入一个值使用了多少字节.根据文档,DATALENGTH()函数应该以字节为单位返回值,但情况似乎并非如此.甲骨文和Postgres的工作情况与预期一致.

-- Oracle, 3 bytes
SELECT LENGTHB('和');    
-- Postgres, 3 bytes
SELECT OCTET_LENGTH('和'); 
**-- SQL Server, 1 byte
SELECT DATALENGTH('和');** 

我应该使用其他功能吗?

推荐答案

首先,SELECT DATALENGTH('和');返回1是正确的.'和'很可能超出了您正在使用的基本代码页,这意味着您实际上是在请求'?'的第DATALENGTH个字节,而这确实只包含1个字节.

Presumably您的Postgres和Oracle环境是UTF-8格式,其中字符占用3个字节.然而,在UCS-2/UTF-16中.字符只占2个字节.在进行这些比较时,您需要实际进行测试fair;确保数据类型和代码页都相同.

如果将字符串的DATALENGTH作为ANSI varchar,UCS-2 nvarchar和UTF-8 varchar进行比较,则分别得到值123:

SELECT DATALENGTH('和') AS [ANSI Length],
       DATALENGTH(N'和') AS [UCS-2 Length],
       DATALENGTH(CONVERT(varchar(4),N'和' COLLATE Latin1_General_100_CI_AI_WS_SC_UTF8)) AS [UTF-8 Length];

Sql相关问答推荐

无效和不匹配的计数

如何利用单列历史SQLsnowflake获得合并结果

替换上一个或下一个值中的空值并添加其价格日期

在SQL查询中使用COALESS

从包含PostgreSQL中的JSON值的列中提取列表或目录

将两列相加为同一表中的行的查询

在子窗口SQL Presto中使用特定条件执行值计数

按行值出现的顺序对行值进行分组

从输出中删除 jsonb_build_object

计算不同模式的时间跨度

SQL Server 查询 WHERE LIKE

SQL 查找 varchar 类型列及其值中多次出现的子字符串

Postgresql 具有相似行为和模式行为的问题

将一名成员金额分配给群组内的其他成员

在没有订单的情况下,如何生成一个值为0的顾客天数行

COBOL\DB2作业(job)需要帮助?快来获取专业指导!

获取 SQL Server 中每一行的两个-之间的文本

我如何编写一个遍历数组数组并将所有值连接成一个字符串的 postgres 函数

在给定列中具有特定值的行与 SQL 中的总行数的比率

SQL - 使用子查询返回多行的 LIKE 命令