Java菜鸟补给站---VARCHAR与CHAR的区别

本文详细解析了数据库中Char与Varchar两种字符串类型的共性与区别,Char为定长存储,适合固定长度数据如身份证号;Varchar为变长存储,更适合长度不一的字符串。

共性

在数据库中,varchar和char都是用于存储字符串类型的数据的,并且,在创建数据表时,使用这2种类型时都必须显式的指定长度!

区别

varchar是变长的,即:存储的字符串的长度可变,例如设计为varchar(8),实际存入Frank时,占用的字符数就只是5,并不是设置值的8!在处理varchar类型的数据时,数据库默认会使用额外的1个字节记录实际存入的字符数量,以存入Frank为例,就会使用额外的1个字节将5这个值记录下来!由于1个字节只有8个二进制位,可以表示的最大数就是1111 1111,转换成十进制就是255,所以,在默认情况下,varchar存储的字符数量上限是255个字符,当设置值与实际存入的字符数量均超过255时,会自动改为使用2个字节来记录实际存入的字符数量,并且,最多也就只会使用2个字节做记录!

char是定长的,即:存储的字符串的长度是固定的,例如设计为char(8),实际存入Frank时,由于长度不足8个,就会自动补3个空格保证存入的数据的长度一定是8个!

小结

当存入的数据的长度是固定值时,应该使用char,例如存储身份证号码、邮政编码等,否则,使用varchar。

### Oracle 中将 CHAR 类型修改为 VARCHAR 类型时遇到 ORA-01439 错误的解决方案 ORA-01439 错误表明在尝试修改列的数据类型时,当前列中已经存在的数据可能无法满足新的定义。具体到从 `CHAR` 转换为 `VARCHAR2` 的场景下,这种错误通常是由于以下原因引起的:目标列中已有数据超出了新定义的长度限制[^1]。 #### 方法一:清理超标数据并直接修改 如果确认可以安全地裁剪超出长度的部分数据,则可以直接定位这些记录并通过截断操作使其符合新的长度要求后再进行修改。 ```sql -- 查找不符合新长度要求的记录 SELECT * FROM your_table WHERE LENGTH(your_column) > new_length; -- 截短过长的数据以适应新的长度 UPDATE your_table SET your_column = SUBSTR(your_column, 1, new_length) WHERE LENGTH(your_column) > new_length; -- 执行修改语句 ALTER TABLE your_table MODIFY your_column VARCHAR2(new_length); ``` 此方法适用于那些允许一定程度数据损失的情况,并且前提是必须确保不会因为数据被裁剪而导致逻辑上的问题[^2]。 #### 方法二:通过临时列实现无损转换 为了防止任何潜在的数据丢失风险,推荐使用一种更为稳妥的方式——借助中间过渡列完成整个转换过程。这种方式不仅可以保留原有数据完整性,还能灵活应对各种复杂的依赖关系。 ```sql -- 添加一个具有期望特性的新列 ALTER TABLE your_table ADD (new_your_column VARCHAR2(new_length)); -- 将原列中的数据复制过来 UPDATE your_table SET new_your_column = TO_CHAR(your_column); -- 移除原有的 CHAR 列 ALTER TABLE your_table DROP COLUMN your_column; -- 重命名新列为原来的名字 ALTER TABLE your_table RENAME COLUMN new_your_column TO your_column; ``` 在这个过程中需要注意的是,新增加的列名应尽量避免其他现有对象发生冲突,同时也要考虑到性能影响以及事务管理等因素[^3]。 --- ### 总结 对于希望在保持数据完整性和一致性前提下的 `CHAR` 至 `VARCHAR2` 类型转变而言,利用临时列作为桥梁是一种可靠的选择。尽管它可能会增加一定的复杂度和时间成本,但从长远来看却能显著减少因不当操作而引发的风险隐患。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值