SQL CHAR 列的长度始终为最大值,无论内容如何

Length of SQL CHAR column is always at maximum regardless of content

我正在为我的 Char 字段寻找 FlameRobin 的 Select LEN(1234) from x Return 4 等价物。

我能找到的只有 char_length,其中 returns 字段的最大长度不是字段的内容。

因为这是 SQL 数据类型 CHAR(固定长度,总是用空格右填充,就像 DBF 和那个时代的其他表格格式)和 VARCHAR 之间的区别(可变长度,可能比最大长度短)。

并且您的查询不是您真正使用的查询!
您建议的查询在 Firebird 中 return 正好是 4。

db<>fiddle here

select rdb$get_context('SYSTEM', 'ENGINE_VERSION') as version
     , rdb$character_set_name
from rdb$database;
VERSION | RDB$CHARACTER_SET_NAME                                                                                                      
:------ | :---------------------------------------------------------------------------------------------------------------------------
3.0.5   | UTF8                                                                                                                        
Select char_LENgth(1234) from rdb$database
| CHAR_LENGTH |
| ----------: |
|           4 |
create table T (
  i integer,
  c char(20),
  v varchar(20)
)
insert into T values (1234, 1234, 1234)
1 rows affected
select * from T
   I | C                                                                                | V   
---: | :------------------------------------------------------------------------------- | :---
1234 | 1234                                                                             | 1234
Select 
  char_length(1234) as const
  , char_length(i) as int_to_char
  , char_length(c) as fixed_char
  , char_length(v) as var_char
  , char_length(trim(c)) as char_t
  , char_length(cast(trim(c) as varchar(20))) as char_t_v
  , char_length(trim(cast(c as varchar(20)))) as char_v_t
from T
CONST | INT_TO_CHAR | FIXED_CHAR | VAR_CHAR | CHAR_T | CHAR_T_V | CHAR_V_T
----: | ----------: | ---------: | -------: | -----: | -------: | -------:
    4 |           4 |         20 |        4 |      4 |        4 |        4

这正是应该发生的事情。如果您将“HELLO”存储在 CHAR(20) 字段中,您将在输出中得到一个 20 个字符的字符串(它可能在路径的某处被修剪,因此您没有意识到初始大小总是被填充或截断到, 20).

要么使用 VARCHAR 类型,要么您必须执行类似 CHAR_LENGTH(TRIM(FieldName)) 的操作来获取字符串的“感知长度”。