亚博88app-亚博全站手机客户端 > 常识 > 互联网 > 网站制作 > 

为什么我们要尽量避免使用char数据类型? -亚博88app

作者:明哥  时间:2024-07-12
描述:对比不同rdbms数据库中对字符数据类型处理的差异。
今天我们来对比下 oracle 与 mysql 中不同字符数据类型的异同,以避免因前期数据结构设计时数据类型选用不当,造成后续存储加工和处理数据时的各种坑。

oracle 与 mysql 中字符数据类型都有哪些

oracle 中内置的字符数据类型主要有以下三大类:

char/nchar:存储固定长度的字符串,其中nchar使用 national character set;
varchar2/varchar/nvarchar2:存储变长字符串,其中 varchar 等同于 varchar2,nvarchar2 使用 national character set;
clob/nclob:存储大小可达 4gb 的字符串,其中 nclob 使用 national character set;

mysql 中字符数据类型主要有:

char:存储固定长度的字符串;
varchar:存储变长字符串
blob/text:主要用来存储大的字符串。

可以看到:

二者都有专门用来处理较大字符串的数据类型,如 clob/blob/text;
二者都有处理定长字符串的数据类型,如 char;
二者都有处理变长字符串的数据类型,如 varchar;

以下我们重点对比下二者对定长和变长字段类型,即 char 和 varchar ,处理时的异同。

oracle 和 mysql 对 char 和 varchar 处理的相同点在哪里?

1 oracle 和 mysql 对定长字段类型 char 的存储处理类似,都会对用户传入的实际的字符串进行加工处理后再存储:

如果用户传入的实际的字符串的长度,跟 ddl 语句中声明的该 char 字段的长度相等,则直接存储用户传入的值;

如果用户传入的实际的字符串的长度,小于 ddl 语句中声明的该 char 字段的长度,oracle 和 mysql 都会在字段末尾补充空格(blank-pad),直到达到声明的长度;

如果用户传入的实际的字符串的长度,大于 ddl 语句中声明的该 char 字段的长度,oracle 和 mysql 都会报错退出(注意:mysql中,可以配置使用非 strict sql mode,此时会截断超常字段然后存储截断后的值并告警,但不会报错退出);

2 oracle 和 mysql 对变长字段类型 varchar 的存储处理类似,都不会对用户传入的实际的字符串进行加工处理,而是直接校验存储:

-如果用户传入的实际的字符串的长度,小于或等于 ddl 语句中声明的该 varchar 字段的最大长度,则直接存储用户传入的值;(实际存储的数据,都是字段值的实际长度和字段的具体值);

如果用户传入的实际的字符串的长度,大于 ddl 语句中声明的该 varchar 字段的最大长度,oracle 和 mysql 都会报错(注意:mysql中,是报错还是截断,跟超长字段是正常字段还是 trailing spaces,以及是否是 strict sql mode 有关);

3 oracle 和 mysql 对变长字段类型 varchar 的取出处理类似

oracle 和 mysql 对变长字段类型 varchar 的取出处理类似,都不会对实际存储的字段值做加工处理,而是直接返回,因为存储时已经做了校验和加工。

4 oracle 和 mysql 中都是 varchar(oracle 中是 varchar2)的存储空间使用率更好

oracle 和 mysql 中都是 varchar(oracle 中是 varchar2)的存储空间使用率更好,因为 char 类型字段在实际长度不够时会在末尾补充空格(blank-pads)并存储这些 trailing blanks 而 varchar 不会,所以 varchar 可以更有效地存储数据,空间使用率更高。

oracle 和 mysql 对 char 和 varchar 处理的不同点在哪里?

1 oracle 和 mysql 对 char 和 varchar 处理的不同点,体现在如何取出 char 类型的字段数据上:

oracle 会将存储的值原封不动地取出,不做任何加工,所以通过length()函数返回的,就是 ddl 语句中声明的长度(当然底层存储时 pad 了 space);

mysql 会将存储的值最右边的空格全部截取后再取出,所以通过length()函数返回的,不是 ddl 语句中声明的长度,而是字段的实际有效长度(当然底层存储时 pad 了 space);

2 oracle 和 mysql 对 char 和 varchar 处理的不同点,体现在如何对比 char 和 varchar 类型的字段数据上:

oracle 对 char/nchar 采用的是 “blank-padded comparison semantics” 模式:如果对比的字段长度不同,oracle 会在较短字段的末尾补充空格使得两者长度相同,然后再逐个字符进行比较。所以只有末尾空格数有差异的字段,对被认为是相等的字段;

oracle 对 varchar2/nvarchar2 采取的是 “non-padded comparison semantics” 模式:只有两个字段的长度相同且字符完全相同,才会被认为是相等的字段;

mysql 对 char, varchar, 和 text 采取的都是类似 oracle 的 “blank-padded comparison semantics” 的模式:即如果对比的字段长度不同, oracle 会在较短字段的末尾补充空格使得两者长度相同,然后再逐个字符进行比较。所以只有末尾空格数有差异的字段,对被认为是相等的字段;

知识总结

oracle 和 mysql 都有对应变长字符串的数据类型,如 varchar/varchar2, 两者在数据的存储和取出上的处理类似;

oracle 和 mysql 都有对应定长字符串的数据类型,如 char,两者对 char 类型字段的存储处理类似,都会校验字段长度,并在字段不够时通过空格右补齐;

oracle 在取出 char 类型字段时,不会做额外处理,会将存储的字段值直接取出;mysql 在取出 char 类型字段时,会对存储的字段值做额外处理,会将字段最右端的空格截掉再返回;

oracle 在对比 char/nchar 类型字段时,采用的是 “blank-padded comparison semantics” 模式;

oracle 在对比 varchar2/nvarchar2 类型字段时,采取的是 “non-padded comparison semantics” 模式;

mysql 在对比 char, varchar, 和 text 类型字段时,采取的都是类似 oracle 的 “blank-padded comparison semantics” 的模式。

本文亚博全站手机客户端的版权归原作者所有

亚博88app-亚博全站手机客户端

站内搜索
无相关信息
微商帮
黄金期货谨慎隔夜持仓;黄金分割线与百分比线
黄金期货谨慎隔夜持仓
自己是否能够像自己想的那样做成一件事,身旁人的判断会比自己准确
自己是否能够像自己想
火宫殿:吃喝玩乐看,烧香拜神佛,红火的庙会经济
火宫殿:吃喝玩乐看,烧香
眼见为实也不为实,更须谨慎看到的并非全貌
眼见为实也不为实,更须
网站地图