我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。
字符与二进制字符串类型详解
一、字符数据类型简介
Oracle数据库提供了多种字符数据类型,主要包括:
- CHAR 和 NCHAR:最多存储2000字节的文本
- VARCHAR2 和 NVARCHAR2:最多存储4000字节的文本
📌 注意:从Oracle 12c版本开始,VARCHAR2、NVARCHAR2和RAW类型可以扩展到存储32,767字节。但这个扩展功能需要手动开启,默认情况下仍然保持原来的限制。
二、字符集是什么?
字符集就像是计算机的"翻译字典",它用二进制代码(0和1)来表示各种字符。不同的字符集可以表示不同的字符:
- US7ASCII:最基础的字符集,只用7位二进制表示128个字符(包括英文字母、数字和常用符号)
- WE8MSWIN1252:西欧字符集,使用8位二进制,除了基础的128个字符外,还能表示带重音符号的字符(如à, á, â等)
三、重要概念:NLS(国家语言支持)
NLS是Oracle的一个重要功能,它决定了:
- 数据如何排序
- 数字和日期的显示格式(比如是用逗号还是句点作为千位分隔符)
- 最重要的是:数据在磁盘上如何存储,以及如何在不同的字符集之间自动转换
四、一个生动的例子:字符集转换的影响
假设数据库使用WE8MSWIN1252字符集(支持带重音符号的字符),而某个客户端只支持US7ASCII字符集(基本英文字符):
- 在数据库中存储了:à, á, â 这三个特殊字符
- 客户端看到的却是:三个普通的字母"a"
- 如果客户端修改数据:特殊字符就会被普通的"a"替换,造成数据丢失
这就好比:
- 数据库会说"普通话和方言"
- 客户端只会听"普通话"
- 当听到方言时,客户端会自动转换成普通话,但有些特色表达就丢失了
五、实际工作中的注意事项
- 数据导出/导入时要特别小心:使用传统工具(如EXP/IMP)时,如果字符集设置不当,可能导致数据损坏
- 推荐使用Data Pump工具:这个工具能更好地处理字符集转换问题
- 终端设置也很重要:如果终端不支持特殊字符,即使数据库中有这些字符,你也看不到正确的显示效果
六、实用工具:DUMP函数
DUMP函数就像是一个"字符检测仪",可以显示:
- 字符的内部编码值
- 字符的存储长度
- 字符的存储格式
使用方法:
SELECT DUMP('a') FROM dual;
-- 结果显示:Typ=96 Len=1: 97
-- 表示:这是一个CHAR类型,长度1字节,内部编码是97
七、给开发者的建议
- 了解你的字符集:知道数据库和客户端分别使用什么字符集
- 测试字符显示:特别是有国际化需求时,要测试各种字符的显示效果
- 谨慎处理数据迁移:在不同字符集的数据库之间迁移数据时,一定要做好测试
💡 温馨提示:如果开发国际化的应用,建议详细阅读Oracle的《全球化支持指南》,这能帮你避免很多字符相关的问题。
总之,字符集就像是语言的"方言",不同的系统可能使用不同的"方言"。了解这些"方言"的差异,才能确保数据在传输和存储过程中不会"失真"。
------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)