在Oracle和MySQL中,VARCHAR(20)的定义确实存在一些关键区别,主要体现在长度单位、存储方式、最大限制等方面。以下是详细对比:
1. 长度单位的定义
| 数据库 | 默认单位 | 说明 |
|---|---|---|
| Oracle | 字节(Byte) | VARCHAR2(20) 表示最多存储20字节的数据,受字符集影响(如UTF-8中一个汉字占3字节)。 |
| MySQL | 字符(Character) | VARCHAR(20) 表示最多存储20个字符,无论字符编码(如UTF-8下汉字和字母均算1字符)。 |
示例场景:
Oracle:若使用
VARCHAR2(20)且字符集为AL32UTF8(UTF-8),存储"你好Hello"(2个汉字 + 5字母 = 2×3 + 5×1 = 11字节),可成功存入。MySQL:
VARCHAR(20)存储"你好Hello",直接计算为7个字符(2汉字 + 5字母),未超出限制。
2. 最大长度限制
| 数据库 | 最大允许长度 | 说明 |
|---|---|---|
| Oracle | VARCHAR2(4000) | 单字段最大支持4000字节(受字符集影响,实际字符数可能更少)。 |
| MySQL | VARCHAR(65535) | 理论最大长度为65535字节,但受行大小限制(通常实际最大为16383字符)。 |
3. 存储与填充行为
| 数据库 | 存储方式 | 说明 |
|---|---|---|
| Oracle | 按实际长度存储,不填充空格 | 存储数据时严格按输入长度保存,不会补空格。 |
| MySQL | 按实际长度存储,不填充空格 | 与Oracle一致,但早期版本(如MySQL 5.0之前)的CHAR会填充空格,VARCHAR不会。 |
4. 语法差异
Oracle:
主要使用
VARCHAR2(推荐),VARCHAR是VARCHAR2的同义词,但未来可能被弃用。
sql
复制
CREATE TABLE oracle_table ( col1 VARCHAR2(20) -- 推荐写法 );MySQL:
仅支持
VARCHAR,无VARCHAR2。
sql
复制
CREATE TABLE mysql_table ( col1 VARCHAR(20) );
5. 字符集的影响
Oracle:
若使用多字节字符集(如
AL32UTF8),VARCHAR2(20)的20字节可能仅能存6个汉字(每个占3字节)。
sql
复制
INSERT INTO oracle_table VALUES ('你好你好你好'); -- 6汉字 ×3=18字节 → 成功 INSERT INTO oracle_table VALUES ('你好你好你好你'); -- 7汉字 ×3=21字节 → 失败(超出20字节)MySQL:
VARCHAR(20)始终以字符为单位,不受单个字符字节数影响。
sql
复制
INSERT INTO mysql_table VALUES ('你好你好你好你好你好'); -- 10汉字 → 10字符 → 成功
6. 版本差异
Oracle:
从12c开始支持扩展数据类型(如
VARCHAR2(32767)),但需显式启用。
sql
复制
ALTER SYSTEM SET max_string_size = EXTENDED;
MySQL:
在5.0.3版本后,
VARCHAR最大长度从255字符提升到65535字节(受行限制)。
总结:关键区别
| 特性 | Oracle (VARCHAR2) | MySQL (VARCHAR) |
|---|---|---|
| 长度单位 | 字节(Byte) | 字符(Character) |
| 最大长度 | 4000字节 | ~16383字符(UTF-8) |
| 字符集影响 | 直接影响可存储字符数量 | 不影响字符数量,影响存储空间 |
| 推荐类型 | VARCHAR2 | VARCHAR |
使用建议
Oracle:
明确字符集需求,优先使用
VARCHAR2。若需按字符数限制,可使用
CHAR或计算字节数(如VARCHAR2(20 CHAR)显式指定字符单位)。
MySQL:
直接使用
VARCHAR(N),无需担心字符集导致的字符数量变化。注意行大小限制(如
ROW_FORMAT=DYNAMIC可提升单行容量)。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




