Oracle字段类型踩坑
用varchar 不许用char
1、场景描述
通过Postman跑一个SpringCloudAlibaba中的一个子服务,debug跟进去看一下,已经接收到参数值(图1);再查看控制台输出的sql(图2),复制控制台的sql到数据库执行是有数据的(图3)。
2、问题排查
①已经确认数据库连接没有问题;
②通常情况下数据有空格,准确查询是查不到的;
③从数据下手,发现光标位置前有空格,准确查询还能查到解释不通
3、字段类型分析
oracle提供了五种字符数据类型:char、nchar、varchar、varchar2、nvarchar2。
char:
使用数据库字符集来存储数据,长度固定,如果存储的数据没有达到指定长度,自动补足空格 。指定长度时,默认长度的计量单位由NLS_LENGTH_SEMANTICS(默认为字节byte)参数决定,但是我们可以手动指定为char或者byte。oracle建议使用NLS_LENGTH_SEMANTICS来指定计量单位,可以提高效率。char类型的最大存储长度为2000个字节,在plsql中,最大存储长度可以达到32767个字节。使用char时, 可以不指定最大长度,此时最大长度为1.
nchar:
使用国家字符集来存储数据,长度固定,如果 存储的数据没有达到指定长度,数据库自动补足空格 。指定长度时, 采用char为计量单位 ,不可以手动指定其他单位。最大存储长度为2000个字节,在plsql中,其最大存储长度可以达到32767个字节。使用nchar时,可以不指定最大长度,此时最大长度为1.
varchar2:
使用数据库字符集存储数据, 长度可变,如果存储数据没有达到指定长度,不自动补足空格 。可使用char,byte为计量单位,默认受参数NLS_LENGTH_SEMANTICS的影响。最大存储长度为4000个字节,在plsql中,存储长度可达32767个字节。 必须指定最大长度,长度最小值为1 .
nvarchar2:
使用国家字符集来存储数据,长度可变,如果存储的数据没有达到指定长度,不自动补足空格。指定长度时, 采用char为计量单位 ,不可以手动指定其他单位。最大存储长度为4000个字节,在plsql中,其最大存储长度可以达到32767个字节。必须指定最大长度,长度最小值为1.
varchar:oracle没有实现该数据类型,varchar与varchar2完全一致。