MySQL中数据类型(char(n)、varchar(n)、nchar(n)、nvarchar(n)的区别)(转)

本文详细解析了char、varchar、nchar、nvarchar等字符数据类型的特性与应用场景,并对比了它们之间的主要区别。

一、第一种

char(n)和varchar(n)的区别:

在这里我们可以清楚的看到他们表面的区别就是前面是否有var,在这里解释一下var是什么意思,var代表“可变的”的意思

下面看个例子:

char(4)//char代表的是字符的意思,这在Java中学过,一个汉字代表一个字符,2个字节;一个英文代表一个字符,一个字节。而这里char(n),(除了它,其余三个都是如此)n是代表字节数,现在我们假如存储‘abcd’(4个字节,所以可以存储),再假如存储‘中国你好’(8个字节,所以不能存储),再假如存储‘ab’(由于是有四个字节,而现在ab只占两个字节,所以用两个空格补上后面的两个字节,所以数据库的数据为‘ab ’) 
varchar(4)//同样我们以上面的例子举例,假如存储‘abcd’(4个字节,所以可以存储),再假如存储‘中国你好’(8个字节,所以不能存储),再假如存储‘ab’(由于是有四个字节,而现在ab只占两个字节,然而varchar(n)是由var开头的,数据是可变的,所以不用像char(4),用空格补字节的方法,而是可以直接省略空格,所以数据库的数据还是‘ab’)

nchar(n)和nvarchar(n)

同样我们先弄清楚以n开头的数据类型是什么意思,已n开头表示此字符是unicode编码的格式,不是以n开头的自然不是unicode编码格式。我们在前面说过,括号里面的n是代表字节数,而在这里,由于是unicode编码格式,所以n代表2n个字节数,同样以上面的例子举例:

nchar(4)//既然是unicode编码格式并且不是可变的,所以总共可以存储2*4=8个字节,我们现在假如存储‘abcd’(由于是只占四个字节,所以在数据库中的数据为‘abcd ’),假如存储‘中国你好’(则完全可以存放) 
nvarchar(4)//既然是unicode编码且为可变的,所以存储‘abcd’(在数据库中的数据为‘abcd’,不会再补空格)

最后,总结一下,var代表可变的,n开头代表是unicode编码。

二、第二种

1、char:

固定长度的非Unicode字符数据,最大长度为8000个字符。 

2、varchar:

可变长度的非Unicode数据,最长为8000个字符。 

3、nvarchar:

可变长度Unicode数据,其最大长度为4000字符。 

4、nchar:

固定长度的Unicode数据,最大长度为4000个字符。 

5、char和varchar都是字符串类型的:

用Unicode编码的字符串,结果是字符的整数值 

用法区别: 

文字字段若长度固定,如:身分证号码,就不要用varchar或nvarchar,应该用char或nchar。 

支持多语言的站点应考虑使用Unicode nchar或nvarchar数据类型以尽量减少字符转换问题 

文字字段若长度不固定,如:地址,则该用varchar或nvarchar。除了可节省存储空间外,存取硬盘时也会较有效率。

第三种:

1、char。char存储定长数据很方便,char字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充,所以在读取的时候可能要多次用到trim()。

2、varchar。存储变长数据,但存储效率没有cahr高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义varchar(10)是最合算的。varchar类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

3、text。text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。

4、nchar、nvarchar、ntext。这三种从名字上看比前面三种多了个“n”。它表示存储的是Unicode数据类型的字符。我们知道字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。nchar、nvarchar的长度是在1到4000之间。和char、varchar比较起来,nchar、nvarchar则最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。

所以一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar 

我把他们的区别概括成:

char,nchar定长,速度快,占空间大,需处理

varchar,nvarchar,text不定长,空间小,速度慢,无需处理

nchar、nvarchar、ntext处理Unicode码

 

参考:

http://blog.youkuaiyun.com/IUNIQUE/article/details/52902033(以上内容部分转自此篇文章)

http://blog.youkuaiyun.com/ivanluc/article/details/5174536(以上内容部分转自此篇文章)

http://www.jb51.net/article/37995.htm(以上内容部分转自此篇文章)

==>如有问题,请联系我:easonjim#163.com,或者下方发表评论。<==
<think>好的,我现在需要处理用户的问题,将MySQLCHARACTER数据类型迁移到Oracle的等效类型。首先,我要回忆一下两种数据库的字符类型差异。根据用户提供的引用,MySQL和Oracle在数据类型上存在差异,迁移时需要特别注意,比如引用[1]中提到数据类型差异是难点之一。 MySQLCHARACTER类型具体包括CHARVARCHARCHAR是定长,VARCHAR是变长。而Oracle中的字符类型主要有CHARVARCHAR2和NCHARNVARCHAR2。这里需要注意,Oracle的VARCHAR2是推荐的变长类型,而VARCHAR虽然存在,但通常建议使用VARCHAR2。此外,Oracle的CHAR也是定长,但默认行为可能与MySQL不同,比如空格填充的问题。 接下来,我需要确定如何将MySQLCHARVARCHAR映射到Oracle。对于CHAR(n),在MySQL中定长,不足会填充空格,而Oracle的CHAR(n)也是定长,行为类似,但字符集可能影响存储空间。例如,如果使用多字节字符集如UTF-8,需要考虑实际存储的字节数。这里可能需要保持相同的长度,但需要确认字符集是否一致,否则可能出现截断问题。 对于VARCHAR(n)MySQL的最大长度是65,535字节,而Oracle的VARCHAR2在12c之前最大是4000字节,12c之后可以扩展到32767字节,但需要启用扩展数据类型。如果用户的MySQLVARCHAR长度超过4000,迁移到Oracle可能需要使用CLOB类型,但用户的问题是关于CHARACTER类型,所以可能主要涉及CHARVARCHAR。如果长度在4000以内,直接映射为VARCHAR2;超过的话需要考虑CLOB,不过这可能属于业务迁移中的难点,如引用[1]提到的LOB字段处理。 另外,字符集的问题也很重要。MySQL的默认字符集可能是utf8mb4,而Oracle通常是AL32UTF8,两者都是UTF-8编码,但可能需要验证是否兼容,特别是特殊字符的存储是否受影响。例如,某些情况下,Oracle的CHAR类型可能会自动填充空格,而MySQL可能不会,这可能导致数据不一致,需要在迁移后做数据校验。 还有NULL和空字符串的处理。Oracle将空字符串视为NULL,而MySQL区分''和NULL。如果MySQL中有存储空字符串的情况,迁移到Oracle时会被成NULL,这可能影响业务逻辑,需要特别注意。引用[1]中也提到NULL值和''值的处理是迁移难点,所以这里可能需要应用层或迁移脚本进行调整。 此外,索引和约束的影响。比如,在MySQL中,CHAR字段如果被索引,迁移到Oracle的CHAR后,由于定长填充空格,可能会影响索引效率或查询结果,特别是在WHERE子句中使用LIKE时。可能需要测试查询性能,确保不会因为数据类型变化导致慢查询。 最后,迁移步骤建议:首先分析现有MySQL的表结构,确定每个CHARVARCHAR字段的长度和字符集;然后映射到Oracle对应的类型,考虑长度限制和字符集兼容性;迁移数据时处理可能的截断或空格填充问题;迁移后进行数据验证,确保数据的完整性和一致性。同时,可能需要修改应用程序中的SQL语句,以适应Oracle的数据类型特性,如引用[1]提到的存储过程改造和复杂SQL的调整。 总结来说,主要映射关系是MySQLCHAR(n)到Oracle CHAR(n)VARCHAR(n)VARCHAR2(n),注意长度限制、字符集和空字符串处理,并进行充分测试。</think>### MySQL CHARACTER类型迁移至Oracle的等效类型换方法 #### 一、数据类型对应关系 1. **CHAR(n)类型** - **MySQL**:定长字符串(不足长度自动填充空格),最大支持$255$字符 - **Oracle**:对应`CHAR(n)`类型 - 需要确保字符集兼容(如MySQL的`utf8mb4`对应Oracle的`AL32UTF8`) - 若MySQLCHAR字段实际存储内容**短于定义长度**,迁移到Oracle时会自动填充空格[^1] 2. **VARCHAR(n)类型** - **MySQL**:变长字符串,最大支持$65,535$字节(受行大小限制) - **Oracle**:对应`VARCHAR2(n)`类型 - 注意Oracle 11g/12c默认最大长度为$4000$字节,若超过需使用`CLOB`类型 - Oracle 12c及以上版本支持扩展的`VARCHAR2(32767)`(需启用`MAX_STRING_SIZE=EXTENDED`参数)[^2] #### 二、迁移注意事项 1. **空值处理差异** - Oracle将空字符串`''`视为`NULL`,而MySQL严格区分`NULL`与`''` - 迁移时需要通过`NVL()`函数或应用层代码显式处理空字符串逻辑[^1] 2. **字符集兼容性** ```sql -- Oracle检查字符集 SELECT value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET'; -- MySQL检查字符集 SHOW VARIABLES LIKE 'character_set_database'; ``` - 若字符集不匹配,需在迁移工具中配置码规则(如`ALTER DATABASE CHARACTER SET AL32UTF8`) 3. **长度单位差异** - MySQL的`VARCHAR(10)`表示$10$字符(根据字符集计算字节) - Oracle的`VARCHAR2(10)`默认表示$10$字节(需显式声明`VARCHAR2(10 CHAR)`表示字符数) #### 三、迁移步骤建议 1. **结构映射阶段** | MySQL类型 | Oracle等效类型 | 特殊处理 | |-----------|----------------|----------| | CHAR(n) | CHAR(n CHAR) | 添加`CHAR`单位声明 | | VARCHAR(n)| VARCHAR2(n CHAR)| 检查长度是否超过$4000$字节 | 2. **数据验证脚本示例** ```sql -- Oracle端验证数据截断 SELECT MAX(LENGTH(migrated_column)) FROM target_table; -- 对比MySQL源数据长度 SELECT MAX(CHAR_LENGTH(source_column)) FROM source_table; ``` 3. **特殊场景处理** - 包含多字节字符(如中文)时,Oracle的`CHAR(10)`可能实际存储少于$10$个汉字 - 使用`NCHAR`/`NVARCHAR2`类型可强制按Unicode字符计算长度 #### 四、迁移工具推荐 1. **Oracle SQL Developer**:提供MySQL到Oracle的自动化迁移工具 2. **AWS Schema Conversion Tool**:自动检测数据类型兼容性问题 3. **自定义ETL脚本**:通过Python/Java实现精细化控制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值