问题
在进行模糊查询的时候,通过全局任意字符串匹配出含有两个字刘姓的人,但是通过刘_
不能匹配出结果。
解决
检查后发现,姓名中包含空格
SELECT * FROM student WHERE TRIM(sname) LIKE '刘_';
第一种解决方案就是查询的时候进行去空格处理,但是一般情况下我们是不知道原数据中是否存在,但是插入数据的时候并没有空格,那么在存储的时候为什么会加入空格呢?
于是我想到数据类型定义,在Oracle数据库中,CHAR 和 VARCHAR2 是用于存储字符数据的两种不同数据类型,它们之间有几个关键区别:
存储方式
CHAR
:固定长度的字符数据类型。无论实际存储的字符串长度是多少,都会占用定义时指定的长度。例如,如果定义一个 CHAR(10) 列,存储一个 5 个字符的字符串时,Oracle 会使用 10 个字符的空间来存储这个字符串,其余部分用空格填充。VARCHAR2
:可变长度的字符数据类型。只有实际存储的字符串所需的长度会被使用。例如,如果定义一个 VARCHAR2(10) 列,存储一个 5 个字符的字符串时,只会占用 5 个字符的空间。
效率和性能
CHAR
:在固定长度的情况下,CHAR 可以在某些特定场景下提高性能(如对大量相同长度字符串的处理),但由于其会填充空格,可能会导致存储效率低下。VARCHAR2
:通常更节省存储空间,并且在大多数场景下性能优于 CHAR。适合存储长度变化较大的字符串。
空格处理
CHAR
:当使用 CHAR 数据类型时,在存储过程中多余的空格会被保留。在查询时,如果有必要,Oracle会自动对字符进行填充对齐。VARCHAR2
:不会存储多余的空格。在查询时,实际的存储内容会返回,不会有填充。
最大长度限制
- 在Oracle 12c及之前,CHAR 和 VARCHAR2 的最大存储长度为 2000 字符(对于 VARCHAR2 也可以设置为 4000 字节,取决于字符集)。在Oracle 12c及以后的版本中,VARCHAR2 的最大长度可以扩展到 32,767 字符(在使用 MAX 选项时)。
将sname
改为varchar2
,同时新插入两条数据,再次查看数据:
综上,数据类型在定义时需要有一定的考虑