zoukankan      html  css  js  c++  java
  • oracle数据库中varchar2陷阱

    https://www.cnblogs.com/iyangyuan/archive/2013/12/25/3491215.html
     对应该类型,在oracle中有三种比较常用的类型:varchar2(byte)、varchar2(char)、nvarchar2()。

             那么这三种类型到底有什么区别呢?

             首先,我们要时刻记清:无论是varchar2还是nvarchar2,最大字节数都是4000

             varchar2(byte):就是默认的表示方式,比如我们写成:varchar2(100),就相当于varchar2(100 byte),表示最大字节数是100,该字段最多能容纳100个字节,强调空间大小。由于我们描述的是字节,因此,保存汉字等字符时,就要小心了。如果你的数据库用的是GBK编码,那么一个汉字将占用2个字节,最多能存50个汉字,如果你的数据库用的是UTF8编码,那么一个汉字将占用3个字节,最多能存33个汉字。

             varchar2(char):表示最大字符数是100,该字段最多能容纳100个字符,强调个数。假设我们写成varchar2(100 char),那么无论是数字、字母、汉字,都看成一个字符,最多写100个,当然,汉字越多,占用的空间越大,同样遵循上边的数据库编码原则。例如:存入一个汉字,底层占2或3个字节,存入一个字母,占1个字节,绝对不是某些文章所说1个字母或数字也占2或3个字节!

             nvarchar2():没有byte、char之分,类似于varchar2(char),只不过nvarchar2()屏蔽了数据库编码,无论是何种编码,nvarchar2()中一个汉字都占两个字节。

             一般的教程,也就到这了,可是如果再多一步思考,会发现一个致命问题。

             实际应用中,很可能会出现这种写法:varchar2(1400 char),我们主观的认为,这个字段最长不能超过1400个字符,这意味着我们可能会存入1399个字符,貌似很正确的样子。

             但是,如果这1399个字符都是汉字,字符长度并没有超过1400,看起来一切正常,但实际上我们损失了一部分数据,为什么?

             因为1399个汉字,按UTF8编码来说(99%的项目都是UTF8编码吧。。),需要占用1399*3=4197个字节,而文章开篇就说,无论是什么char,最大长度就是4000字节,一个也不能多,因此多出来的197个字节,都会抹去,而整个过程中,无任何错误提示,你的数据就这样蒸发了!

             所以,对于GBK编码的数据库而言,安全的写法为:varchar2(2000 char)、nvarchar2(2000),对于UTF8编码的数据库而言,安全的写法为:varchar2(1333 char)、nvarchar2(2000)。

  • 相关阅读:
    VMware vSphere 服务器虚拟化之二十四 桌面虚拟化之手动池管理物理机
    重思人性自我修养
    初窥Linux 之 数据流重定向
    MTD设备驱动
    wubi安装ubuntu后,增加swap大小,优化swap的使用参数-----------让ubuntu健步如飞,为编译android源码准备
    【deep learning学习笔记】最近读的几个ppt(四)
    computer专业术语总结
    弃用个人博客站重返CSDN缘由
    Hadoop1.0.4伪分布式安装
    谈谈我2013上半年在公司内部培训的经历
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/8862118.html
Copyright © 2011-2022 走看看