当前位置: 首页 > 科技观察

CHAR还是VARCHAR?就是那个问题!

时间:2023-03-14 11:10:29 科技观察

本文转载自微信公众号《铭哥的IT随笔》,作者:IT哥。转载本文请联系铭哥IT随笔公众号。1前言大家好,我是明哥!今天我们就比较一下ORACLE和MYSQL中不同字符数据类型的异同,避免在前期的数据结构设计中,由于数据类型选择不当而导致后续存储、处理、数据处理等方面出现各种问题。坑。2ORACLE和MYSQL中的字符数据类型有哪些?ORACLE内置的字符数据类型主要有以下三类:CHAR/NCHAR:存储定长字符串,NCHAR使用国家字符集;VARCHAR2/VARCHAR/NVARCHAR2:存储变长字符串,其中VARCHAR等同于VARCHAR2,NVARCHAR2使用国家字符集;CLOB/NCLOB:存储最大4GB大小的字符串,其中NCLOB使用国家字符集;MYSQL中的字符数据类型主要有:CHAR:存储定长字符串;VARCHAR:存储变长字符串BLOB/TEXT:主要用于存储大字符串。可以看出:两者都有专门用来处理较大字符串的数据类型,比如CLOB/BLOB/TEXT;两者都有处理固定长度字符串的数据类型,例如CHAR;两者都有处理可变长度字符串的数据类型,比如VARCHAR;下面我们将着重比较两者对于定长和变长字段类型的异同,即CHAR和VARCHAR。3ORACLE和MYSQL在CHAR和VARCHAR上的相似点是什么?3.1ORACLE和MYSQL对定长字段类型CHAR的存储和处理类似,都是对用户实际传入的字符串进行处理和存储:如果用户通过如果用户实际输入的字符串长度等于DDL语句中声明的CHAR字段的长度,用户传入的值将直接存储;如果用户实际传入的字符串的长度小于DDL语句中声明的CHAR字段的长度CHAR字段的长度,ORACLE和MYSQL都会在末尾添加空格(blank-pad)字段,直到达到声明的长度;如果用户实际传入的字符串长度大于DDL语句中声明的CHAR字段长度,ORACLE和MYSQL都会报错退出(注意:MYSQL中非STRICTSQLMODE可以配置使用,此时会截断多余的字段并存储截断后的值并报警,但不报错退出);3.2ORACLE和MYSQL对变长字段VARCHAR类型的存储处理类似,不会对用户实际传入的字符串进行处理,而是直接检查存储:-如果用户实际传入的字符串长度小于等于DDL语句中声明的VARCHAR字段的最大长度,直接存储用户传入的值;(实际存储的数据是字段值的实际长度和字段的具体值);如果用户实际传入的字符串长度大于DDL语句中声明的VARCHAR字段的最大长度,ORACLE和MYSQL都会报错(注意:MYSQL中是报错还是截断取决于关于超长字段是普通字段还是尾随空格,是否为STRICTSQLMODE);3.3ORACLE类似于MYSQL对变长字段类型VARCHAR的检索处理。ORACLE和MYSQL对变长字段类型VARCHAR的检索处理类似。他们不会对实际存储的字段值进行处理,而是直接返回,因为在存储的时候已经完成了。校准和处理。3.4ORACLE和MYSQL都是VARCHAR(ORACLE是VARCHAR2)存储空间利用率比较好。ORACLE和MYSQL都是VARCHAR(ORACLE是VARCHAR2)存储空间利用率比较好,因为CHAR类型的字段实际长度不够在最后加blank-pads存储这些尾随的空白时,VARCHAR不会,所以VARCHAR可以更有效地存储数据并具有更高的空间使用率。4ORACLE和MYSQL在处理CHAR和VARCHAR方面有什么区别?4.1ORACLE和MYSQL在处理CHAR和VARCHAR的区别体现在如何提取CHAR类型的字段数据:ORACLE会原封不动地提取存储的值,不做任何处理,所以LENGTH()函数返回的就是长度在DDL语句中声明(当然是在底层存储中填充空间);MYSQL会截取存储值最右边的所有空格然后取出来,所以通过LENGTH()函数返回的不是DDL语句中声明的长度,而是字段实际有效长度(当然,底层存储用空格填充);4.2ORACLE和MYSQL在处理CHAR和VARCHAR方面的区别体现在如何比较CHAR和VARCHAR类型的字段数据:Oracle对CHAR/NCHAR采用“补空比较语义”模式:如果比较的字段长度不同,Oracle会在较短的字段末尾添加空格,使两个长度相同,然后逐个字符比较字符。因此,只有末尾空格数不同的字段才被认为是相等的;Oracle对VARCHAR2/NVARCHAR2采用“非填充比较语义”模式:只有长度相同且字符完全相同的两个字段才会被认为是相等的。字段被认为是相等的;MySQL对CHAR、VARCHAR、TEXT采用了类似于ORACLE的“补空比较语义”的模式:即如果比较的字段长度不同,Oracle会在较短的字段末尾添加空格,使两者相同length然后逐个字符比较。因此,只有末尾空格数不同的字段才被认为是相等的;5知识总结ORACLE和MYSQL都有对应变长字符串的数据类型,如VARCHAR/VARCHAR2,都是在数据存储和检索方面。处理过程类似;ORACLE和MYSQL都有对应定长字符串的数据类型,比如CHAR,对CHAR类型的字段都有类似的存储处理,都会检查字段的长度,字段不长的时候在右边补空格足够的;ORACLE中提取CHAR类型字段时,不会做额外处理,直接提取存储的字段值;MYSQL在提取CHAR类型的字段时会对存储的字段值做额外处理,返回前会截掉该字段最右边的空格;Oracle在比较CHAR/NCHAR类型字段时,采用了“补空比较语义”模式;Oracle在比较VARCHAR2/NVARCHAR2类型字段时采用“非填充比较语义”模式;MySQL对CHAR、VARCHAR、TEXT类型字段的比较采用类似于ORACLE的“补空比较语义”的模式;mysql中的CHAR和varcharoracle和mysql中的CHAR