首页 / 字符串
LENGTH 字符串长度
LENGTH 在不同引擎中统计的单位不同:StarRocks 和 Doris 的 LENGTH 返回字节数,一个汉字算 3;Hologres、Hive 和 Spark 的 LENGTH 返回字符数。按字符计数时,StarRocks 和 Doris 要改用 CHAR_LENGTH,Flink 也只有 CHAR_LENGTH。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | LENGTH(str) | 返回 BIGINT,输入不是 UTF-8 编码时返回 -1。按字节计算长度要用 LENGTHB。 | 官方文档 |
| Hologres | 支持 | LENGTH(str) | 按 UTF-8 字符计数,一个汉字、数字或字母都算 1,结果与 CHAR_LENGTH 相同。字节数用 OCTET_LENGTH。 | 官方文档 |
| StarRocks | 需改写 | char_length(str) | LENGTH 返回的是字节数。按字符计数要用 char_length,别名 character_length,目前只支持 UTF-8。 | 官方文档 |
| Doris | 需改写 | CHAR_LENGTH(str) | LENGTH 返回 UTF-8 编码下的字节数,别名 OCTET_LENGTH。按字符计数要用 CHAR_LENGTH,别名 CHARACTER_LENGTH。 | 官方文档 |
| Hive | 支持 | length(string A) | 返回字符串长度。Hive 2.2.0 起还有 character_length(简写 char_length)返回 UTF-8 字符数,octet_length 返回字节数。 | 官方文档 |
| Spark SQL | 支持 | length(expr) | 返回字符数,包含末尾的空格;对二进制数据返回字节数。字节数用 octet_length。 | 官方文档 |
| Flink SQL | 别名 | CHAR_LENGTH(string) | 返回字符数,别名 CHARACTER_LENGTH。内置函数中没有 LENGTH。 | 官方文档 |
迁移注意事项
- StarRocks 和 Doris 的 LENGTH 返回字节数。像 WHERE LENGTH(name) > 10 这样的条件,迁移后对中文内容会多筛出很多行,而且不会报错。
- 按字符计数统一写 CHAR_LENGTH 最稳妥:Hologres、StarRocks、Doris、Flink 都支持,Hive 2.2.0 起也支持(char_length 是 character_length 的简写)。
- MaxCompute 的 LENGTH 遇到非 UTF-8 编码的字符串返回 -1,不是 NULL。
- Spark 的 length 会把末尾空格算进去。从定长 CHAR 列迁移过来的数据要注意补齐的空格。
示例
找出名称超过 10 个字符的商品
SELECT item_name FROM items WHERE LENGTH(item_name) > 10;SELECT item_name FROM items WHERE LENGTH(item_name) > 10;SELECT item_name FROM items WHERE char_length(item_name) > 10;SELECT item_name FROM items WHERE CHAR_LENGTH(item_name) > 10;SELECT item_name FROM items WHERE length(item_name) > 10;SELECT item_name FROM items WHERE length(item_name) > 10;SELECT item_name FROM items WHERE CHAR_LENGTH(item_name) > 10;