-
星空体育登录入口:选择使用CHAR还是VARCHAR成为了一个问题!
- 时间:2024-06-22 来源:zoc7RcITctunhMtq7EzA 人气:
本篇文章转载自微信公众号「明哥的IT随笔」,作者是IT明哥。请在转载本文时联系明哥的IT随笔公众号星空体育网站。
大家好,我是明哥,前来致辞。今天我们来比较一下 ORACLE 和 MYSQL 中不同的字符数据类型,以避免在设计数据结构时选择不当的数据类型,从而导致后续存储和处理数据时出现各种问题星空体育网页版。ORACLE 和 MYSQL 中的字符数据类型都有哪些呢?\n在 ORACLE 中,内置的字符数据类型主要分为以下三类:\nCHAR/NCHAR:用于存储固定长度的字符串,其中 NCHAR 使用国家字符集;\nVARCHAR2/VARCHAR/NVARCHAR2:用于存储可变长度的字符串,其中 VARCHAR 等同于 VARCHAR2,NVARCHAR2 使用国家字符集;\nCLOB/NCLOB:用于存储大小可达 4GB 的字符串。NCLOB 使用国家字符集;
MYSQL 中的字符数据类型包括:\nCHAR: 用于存储固定长度的字符串;
两者都有特定的数据类型用于处理长字符串,比如 CLOB/BLOB/TEXT; 两者都有用于处理固定长度字符串的数据类型,比如CHAR; 两者都有用于处理可变长度字符串的数据类型,比如VARCHAR;
可以发现:
接下来我们将重点比较这两者对于固定长度和可变长度字段类型,即CHAR和VARCHAR,在处理时的异同之处。
在ORACLE和MYSQL中,CHAR和VARCHAR的处理有哪些相似之处星空体育登录入口?3.1 ORACLE和MySQL对定长字段类型CHAR的存储处理方式相似,都会在存储之前对用户传入的实际字符串进行加工处理:\n如果用户传入的实际字符串长度与DDL语句中声明的CHAR字段长度相等,则直接存储用户传入的值; \n如果用户传入的实际字符串长度小于DDL语句中声明的CHAR字段长度,ORACLE和MySQL都会在字段末尾补充空格,直到达到声明的长度; \n如果用户传入的实际字符串长度大于DDL语句中声明的CHAR字段长度,则...ORACLE和MYSQL都会在遇到错误时退出(注意:在MYSQL中,可以配置使用非严格的SQL模式,此时会截断超出长度的字段值并存储截断后的值并发出警告,但不会报错退出)。\n3.2 ORACLE和MYSQL在对于变长字段类型VARCHAR的存储处理上类似,都不会对用户传入的实际字符串进行处理,而是直接校验存储: \n- 如果用户传入的实际字符串长度小于或等于DDL语句中声明的VARCHAR字段的最大长度,就直接存储用户传入的值;(实际上存储的数据,所有字段的具体值和实际长度。如果用户提供的字符串长度超过了DDL语句中声明的VARCHAR字段的最大长度,ORACLE和MYSQL都会报错(注意:在MYSQL中,是否会报错还是截断取决于是否启用了STRICT SQL MODE,以及是否为超长字段或正常字段还是保留了空格)。3.3 ORACLE和MYSQL在处理变长字段类型VARCHAR时类似;对于VARCHAR字段类型的取出,ORACLE和MYSQL处理方式相似,都不会对存储的字段值进行加工处理。而是直接返回,因为在存储时已经进行了校验和加工。在ORACLE和MYSQL中,VARCHAR(ORACLE中为VARCHAR2)类型的存储空间利用率更佳。这是因为当CHAR类型字段的实际长度不足时,会在末尾填充空格并存储这些多余的空格,而VARCHAR则不会这样做,因此VARCHAR可以更有效地存储数据,空间利用率更高。3.4 ORACLE和MYSQL中,VARCHAR(在ORACLE中为VARCHAR2)的存储空间利用效率更高
。\nORACLE和MYSQL中,VARCHAR(在ORACLE中为VARCHAR2)的存储空间利用效率更高。因为当实际长度不足时,CHAR类型字段会在末尾填充空格并存储这些尾随空格,而VARCHAR不会,因此VARCHAR能够更有效地存储数据,空间利用率更高星空体育手机版。 4 ORACLE和MYSQL在处理CHAR和VARCHAR方面有何不同?Oracle和MySQL在处理CHAR和VARCHAR数据时有不同之处,主要体现在如何提取CHAR类型字段的数据上:\n- Oracle会原封不动地提取存储的值,不进行任何处理,因此通过LENGTH()函数返回的值就是DDL语句中声明的长度(当然,在底层存储时会填充空格);\n- MySQL会将存储的值右侧的空格全部截取后再提取,因此通过LENGTH()函数返回的值不是DDL语句中声明的长度星空体育入口。而是字段的实际有效长度,当数据存储时会用空格填充;\n4.2 Oracle 和 MySQL 在处理 CHAR 和 VARCHAR 类型字段数据时存在差异: \nOracle 对 CHAR/NCHAR 采用了“blank-padded comparison semantics”模式:如果比较的字段长度不同,Oracle 会在较短字段的末尾用空格填充使得两者长度相同,然后再逐个字符进行比较。因此,只有末尾空格数不同的字段才会被视为相等的字段;Oracle 对于VARCHAR2/NVARCHAR2采用了"非填充比较语义"模式:只有两个字段的长度相同且字符完全相同才被视为相等的字段;MySQL对CHAR、VARCHAR和TEXT采用了类似于Oracle的"填充比较语义"模式:若对比字段的长度不同,Oracle会在较短的字段末尾填充空格,以使它们长度相同。接着逐个字符进行对比。因此,只有末尾空格数量不同的字段被视为相等的字段。5.知识总结\nORACLE和MYSQL都有相应的变长字符串数据类型,如VARCHAR/VARCHAR2,它们在数据的存储和取出方面的处理类似。\nORACLE和MYSQL都有相应的定长字符串数据类型,如CHAR,它们对CHAR类型字段的存储处理类似,都会校验字段长度,并在字段不足时通过右边补齐空格。\n在取出CHAR类型字段时,ORACLE不会进行额外处理,会直接取出存储的字段值;而MYSQL在取出CHAR类型字段时,会对存储的字段值进行额外处理。在返回数值时,会将字段右侧多余的空格去除;{ n }\n在比较CHAR/NCHAR类型字段时,Oracle采用的是“blank-padded comparison semantics”模式;{ n }\n在比较VARCHAR2/NVARCHAR2类型字段时,Oracle采用的是“non-padded comparison semantics”模式;{ n }\nMySQL在比较CHAR、VARCHAR和TEXT类型字段时,所采用的是类似 ORACLE 的“blank-padded comparison semantics”模式;MySQL 中的CHAR和varchar
Oracle 和 MySQL 中的CHAR星空体育官方
星空体育登录入口 星空体育手机版