读书笔记:字符与二进制字符串类型详解

我们的文章会在微信公众号IT民工的龙马人生博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。

本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。

字符与二进制字符串类型详解

一、字符数据类型简介

Oracle数据库提供了多种字符数据类型,主要包括:

  • CHARNCHAR:最多存储2000字节的文本
  • VARCHAR2NVARCHAR2:最多存储4000字节的文本

📌 注意:从Oracle 12c版本开始,VARCHAR2、NVARCHAR2和RAW类型可以扩展到存储32,767字节。但这个扩展功能需要手动开启,默认情况下仍然保持原来的限制。

二、字符集是什么?

字符集就像是计算机的"翻译字典",它用二进制代码(0和1)来表示各种字符。不同的字符集可以表示不同的字符:

  • US7ASCII:最基础的字符集,只用7位二进制表示128个字符(包括英文字母、数字和常用符号)
  • WE8MSWIN1252:西欧字符集,使用8位二进制,除了基础的128个字符外,还能表示带重音符号的字符(如à, á, â等)

三、重要概念:NLS(国家语言支持)

NLS是Oracle的一个重要功能,它决定了:

  • 数据如何排序
  • 数字和日期的显示格式(比如是用逗号还是句点作为千位分隔符)
  • 最重要的是:数据在磁盘上如何存储,以及如何在不同的字符集之间自动转换

四、一个生动的例子:字符集转换的影响

假设数据库使用WE8MSWIN1252字符集(支持带重音符号的字符),而某个客户端只支持US7ASCII字符集(基本英文字符):

  1. 在数据库中存储了:à, á, â 这三个特殊字符
  2. 客户端看到的却是:三个普通的字母"a"
  3. 如果客户端修改数据:特殊字符就会被普通的"a"替换,造成数据丢失

这就好比:

  • 数据库会说"普通话和方言"
  • 客户端只会听"普通话"
  • 当听到方言时,客户端会自动转换成普通话,但有些特色表达就丢失了

五、实际工作中的注意事项

  1. 数据导出/导入时要特别小心:使用传统工具(如EXP/IMP)时,如果字符集设置不当,可能导致数据损坏
  2. 推荐使用Data Pump工具:这个工具能更好地处理字符集转换问题
  3. 终端设置也很重要:如果终端不支持特殊字符,即使数据库中有这些字符,你也看不到正确的显示效果

六、实用工具:DUMP函数

DUMP函数就像是一个"字符检测仪",可以显示:

  • 字符的内部编码值
  • 字符的存储长度
  • 字符的存储格式

使用方法:

SELECT DUMP('a') FROM dual;
-- 结果显示:Typ=96 Len=1: 97
-- 表示:这是一个CHAR类型,长度1字节,内部编码是97

七、给开发者的建议

  1. 了解你的字符集:知道数据库和客户端分别使用什么字符集
  2. 测试字符显示:特别是有国际化需求时,要测试各种字符的显示效果
  3. 谨慎处理数据迁移:在不同字符集的数据库之间迁移数据时,一定要做好测试

💡 温馨提示:如果开发国际化的应用,建议详细阅读Oracle的《全球化支持指南》,这能帮你避免很多字符相关的问题。

总之,字符集就像是语言的"方言",不同的系统可能使用不同的"方言"。了解这些"方言"的差异,才能确保数据在传输和存储过程中不会"失真"。

------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

posted @ 2025-09-28 15:25  认真就输  阅读(11)  评论(0)    收藏  举报