当前位置: 首页 > news >正文

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

我们的文章会在微信公众号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)

http://www.hskmm.com/?act=detail&tid=20005

相关文章:

  • 析构——循环引用
  • 一些树上问题
  • 如何用 ShedLock 让 Spring Boot 的定时任务在多实例环境下只执行一次
  • 故障处理:Oracle表空间异常增长后又恢复正常的故障模拟与分析
  • Oracle故障分析:lsnrctl start启动监听很慢(AIX平台)
  • 第十届新能源系统、电气与电力国际学术会议 (NESEP 2025)
  • 数据结构 - 二叉树的非递归方式遍历
  • 1208. 翻硬币
  • C# Avalonia 15- Animation- CachingTest
  • CF838D Airplane Arrangements
  • java操作数据库中的bug
  • 事务和Spring常用注解的总结
  • 浅谈SQL应用考试,临时抱佛脚篇
  • 网络安全风险评估指南:CISO如何通过风险评估提升安全防护
  • 藏好自己,做好清理——悼念沈劫匪先生有感
  • macbook m1 安装telnet
  • 低空经济:从政策热词到生活日常——中国低空经济全景解析与杭深模式对比 - 教程
  • 指数函数的特征
  • 生猪
  • git merge driver简介
  • 在 Linux 中安装和配置 NTP 服务器和 NTP 客户端
  • Android15音频进阶之车载多音区调整解析(一百三十七)
  • 微信二次开发社群机器人接口
  • FireDAC(Master-Detail 功能)主从表查询
  • 极氪汽车火山引擎:AI数据专家“上岗”,注入“分钟级”数据洞察力
  • C++面试宝典 01 new/delete/malloc/free关系
  • Ansible + Docker 部署 MinIO 集群
  • ​​万用表与电流探头测量电流信号的技术对比分析​​
  • flink运行时架构 - --
  • k8s命令