# 获取字符串长度
DWS支持以下函数计算字符串的长度，包括获取**位数** 、**字节数** 和**字符数** 。关于位数、字节数和字符数的区别可参见[字符串处理函数和操作符总体介绍](https://support.huaweicloud.com/sqlreference-dws/dws_06_0410.html)。
表1获取字符串长度常用函数 
| 分类          | 功能                              | 对应函数                                                                                                                                                                                                                      | 简单示例                      | 使用区别                                                                                                                                                                                                                                                                                    |
|:---|:---|:---|:---|:---|
| 获取位数         | 获取字符串的位数。                        | [bit_length(string)]                                                                                                                                                 | ``` SELECT bit_length('world'); bit_length ------------ 40 (1 row) ```    | -                                                                                                                                                                                                                                                                                     |
| 获取字节数          | 获取所有字符串类型的字节数。                   | [octet_length(string)]                                                                                                                                                | ``` SELECT octet_length('world'); octet_length ------------ 5 (1 row) ``` | octet_length(string)与lengthb(string)在功能上完全一致，在处理MySQL/DWS等跨平台数据库开发时，**优先使用octet_length(string)** ，**lengthb(string)** 是为了兼容Oracle而设定的一个映射函数，**仅在Oracle迁移业务使用**。 lengthb(text/bpchar)与lengthb(string)一致，只是特指入参为text或bpchar类型的情况。  |
| 获取字节数          | 获取所有字符串类型的字节数，仅为兼容Oracle。        | [lengthb(string)]                                                                                                                                                    | ``` SELECT lengthb('abc'::text); lengthb ------------ 3 (1 row) ```       | octet_length(string)与lengthb(string)在功能上完全一致，在处理MySQL/DWS等跨平台数据库开发时，**优先使用octet_length(string)** ，**lengthb(string)** 是为了兼容Oracle而设定的一个映射函数，**仅在Oracle迁移业务使用**。 lengthb(text/bpchar)与lengthb(string)一致，只是特指入参为text或bpchar类型的情况。  |
| 获取字节数          | 获取text、bpchar类型的字节数，仅为兼容Oracle。 | [lengthb(text/bpchar)]                                                                                                                                                 | ``` SELECT lengthb('abc'::CHAR(5)); lengthb ------------ 5 (1 row) ```    | octet_length(string)与lengthb(string)在功能上完全一致，在处理MySQL/DWS等跨平台数据库开发时，**优先使用octet_length(string)** ，**lengthb(string)** 是为了兼容Oracle而设定的一个映射函数，**仅在Oracle迁移业务使用**。 lengthb(text/bpchar)与lengthb(string)一致，只是特指入参为text或bpchar类型的情况。  |
| 获取字符数  | 获取字符串的字符数。                      | [char_length(string)或character_length(string)] [length(string)] | ``` SELECT length('database'); length -------- 8 (1 row) ```              | length(string)功能与char_length(string)完全等价，写法更简洁。                                                                                                                                                                                                                                        |
| 获取字符数  | 获取指定编码格式的字符串的字符数。               | [length(string bytea, encoding name)]                                                                                                                                   | -                          | -                                                                                                                                                                                                                                                                                      |
   
 #### bit_length(string)
描述：字符串的位数。返回结果为字节数乘以8，得到总位数。字符串的位数取决于数据库编码方式，例如GBK字符编码下，一个中文为2个字节，UTF8和SQL_ASCII字符编码下，一个中文字为3个字节。
返回值类型：integer
示例：
```
SELECT bit_length('world');
 bit_length
------------
         40
(1 row)
```
GBK字符编码下，示例：
```
SELECT bit_length('我们');
 bit_length
------------
         32
(1 row)
```
UTF8和SQL_ASCII字符编码下，示例：
```
SELECT bit_length('我们');
 bit_length
------------
         48
(1 row)
```
 #### octet_length(string)
描述：获取字符串中的字节数。该函数返回字符串的字节数，对于处理多字节字符（如 UTF-8 编码的汉字、特殊符号等）非常重要，它能准确获取字符串的存储大小。
返回值类型：integer
示例：
```
SELECT octet_length('data');
 octet_length
--------------
            4
(1 row)
SELECT octet_length('数据库');
 octet_length
--------------
            9
(1 row)
```
 #### lengthb(string)
描述：获取字符串的字节长度。**功能与[octet_length(string)]没有任何差别** ，只是为兼容Oracle而存在，如果是从Oracle迁移过来的场景，请使用lengthb(string)，但**如果业务需要跨数据库运行（如同时兼容DWS和MySQL），请使用** **octet_length(string)**，因为MySQL没有lengthb函数。
返回结果与字符集有关，同样的中文字符，在GBK与UTF8中，返回的字节数不同。
返回值类型：integer
示例：
```
SELECT lengthb('hello');
 lengthb 
---------
       5
(1 row)
```
 #### lengthb(text/bpchar)
描述：获取指定字符串的字节数，入参支持text、bpchar（等同于CHAR(n)），其中:
- lengthb(text)表示计算实际字符的字节长度（无填充空格），适合绝大多数业务场景。
- lengthb(bpchar)表示计算固定长度字符串的字节长度（包含填充空格），适合严格定长场景（如固定长度的编码、证件号），不推荐日常使用（空格填充易引发隐式问题）。
返回值类型：integer
![](https://support.huaweicloud.com/sqlreference-dws/public_sys-resources/note_3.0-zh-cn.png)
- 若字符串中存在换行符，如字符串由一个换行符和一个空格组成，在DWS中LENGTH和LENGTHB的值为2。
- 此函数获取的为指定字符串的字节数，对于多字节字符编码，一个字符可能占用多个字节（例如，UTF-8编码中，中文字符通常占用3个字节）。
 
示例：
```
SELECT lengthb('hello');
 lengthb
---------
       5
(1 row)
```
入参为text类型和bpchar类型的示例对比如下：
```
-- 案例1: 使用 text 类型
SELECT lengthb('abc'::text);    -- 'abc'占用3字节（UTF-8），返回3
-- 案例2: 使用 bpchar (CHAR(5)) 类型
SELECT lengthb('abc'::CHAR(5)); -- 存储为 'abc  '， 返回5（每个空格占1字节）
```
![](https://support.huaweicloud.com/sqlreference-dws/figure/zh-cn_image_0000002483953324.png "点击放大")
UTF8编码中，示例：
```
SELECT lengthb('数据库');
 lengthb
---------
       9
(1 row)
```
 #### char_length(string)或character_length(string)
描述：获取字符串中的字符个数。
返回值类型：integer
![](https://support.huaweicloud.com/sqlreference-dws/public_sys-resources/note_3.0-zh-cn.png)
对于多字节字符编码，一个字符可能占用多个字节（例如，UTF-8编码中，中文字符通常占用3个字节）。
示例：
```
SELECT char_length('hello');
 char_length
-------------
           5
(1 row)
SELECT char_length('数据库');
 char_length
-------------
           9
(1 row)
```
 #### length(string)
描述：获取字符串的字符长度（字符数量），length(string)功能与[char_length(string)]完全等价，写法更简洁。
返回值类型：integer
示例：
```
SELECT length('database');
 length 
--------
      8
(1 row)
```
 #### length(string bytea, encoding name)
描述：获取指定编码格式的字符串的字符数。在指定的编码格式中，string必须是有效的。
返回值类型：integer
示例：
```
SELECT length('database', 'UTF8');
 length
--------
      8
(1 row)
```
