读书笔记:Oracle数据库中的字符类型:为什么你该用VARCHAR2而不是CHAR
我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。
Oracle数据库中的字符类型:为什么你该用VARCHAR2而不是CHAR
在使用Oracle数据库时,选择合适的字符类型很重要。Oracle提供四种字符类型:CHAR、VARCHAR2、NCHAR和NVARCHAR2,但你真的需要全部了解吗?
存储方式的真相
所有字符串在Oracle中的存储方式其实是一样的:都有一个1-3字节的长度标识,然后是实际数据。如果是空值(NULL),就用一个字节的0xFF表示。
有趣的是,如果表中最后几个字段都是NULL,Oracle根本不会为它们分配存储空间!只有在NULL字段后面还有非NULL字段时,才会用标志位表示这些空值。
CHAR类型的问题
虽然CHAR和VARCHAR2看起来相似,但CHAR类型有个特点:它会自动用空格填充到指定长度。比如CHAR(20)存储"Hello World"时,实际上存储的是"Hello World"加上9个空格。
这导致两个问题:
- 浪费存储空间,表和索引都会变得更大
- 查询时容易出错,因为"Hello World"和"Hello World+9个空格"被认为是不相同的
实际应用中的坑
举个例子,如果你的应用程序用变量绑定方式查询:
variable v varchar2(20)
exec :v := 'Hello World'
用这个变量查询CHAR字段会找不到数据,但查询VARCHAR2字段就能找到。这是因为CHAR类型会自动填充空格,但绑定变量不会。
字节vs字符的区别
在多字节字符集(如UTF-8)中,一个字符可能占用多个字节。比如:
- VARCHAR2(1) 表示1个字节,可能存不下1个中文字符
- VARCHAR2(1 char) 表示1个字符,无论占用几个字节
建议在多字节环境下使用CHAR修饰符,明确指定的是字符数而不是字节数。
实用建议
- 优先选择VARCHAR2/NVARCHAR2,避免使用CHAR/NCHAR
- 在多字节字符集环境中,使用VARCHAR2(20 char)这样的定义
- 即使对于单字符字段,也推荐使用VARCHAR2(1)而不是CHAR(1)
- 注意4000字节的长度限制,虽然从12c开始可以扩展到32767字节
记住这些要点,可以帮助你设计出更高效、更少问题的数据库结构。毕竟,好的开始是成功的一半,在数据库设计阶段做出正确选择,能避免后续很多麻烦。
------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

浙公网安备 33010602011771号