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))
的操作来获取字符串的“感知长度”。
我正在为我的 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))
的操作来获取字符串的“感知长度”。