数据库中char、nvarchar和varchar的区别
这3种字符串数据类型是我们使⽤最多的,我们在数据库设计时到底该怎么使⽤了?
⾸先我们先来分析3个数据类型的说明:
CHAR的长度是固定的,最长2000个字符; varchar 和 varchar2可以肯定的是oracle中⽬前是可以使⽤varchar数据类型的,但他们的区别我查了不少资料也没有到⼀个准确的答案最常见的说话是说oracle中的varchar只是varchar2的别名也就是同义词。其次也有⼈认为varchar是最⼤长度为2000的可变字符串(和sql server中的varchar⼀致),⽽varchar2最⼤长度为4000。
知道了他们的特点我们就来讨论下使⽤区别:
1.char和varchar、varchar2
由于varchar和varchar2⽤途类似,我们先来讨论char和他们的使⽤区别:
varchar2最大长度varchar和varchar2⽐char节省空间,在效率上⽐char会稍微差⼀些,即要想获得效率,就必须牺牲⼀定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’。varchar和varchar2虽然⽐char节省空间,但是如果⼀个varchar和varchar2列经常被修改,⽽且每次被修改的数据的长度不同,这会引起‘⾏迁移’(Row
Migration)现象,⽽这造成多余的I/O,是数据库设计和调整中要尽⼒避免的,在这种情况下⽤char 代替varchar和varchar2会更好⼀些。当然还有⼀种情况就是象⾝份证这种长度⼏乎不变的字段可以考虑使⽤char,以获得更⾼的效率。
2.varchar和varchar2
这⾥就进⼊重点了,前⾯的区别我们在sql server中我们已经基本了解了,⼤家可能都知道,最多也就是复习下,但oracle增加了⼀个varchar2类型,是⼤家以前所没有⽤到过的。因为oracle保证在任何版本中该数据类型向上和向下兼容,但不保证varchar,还有其他数据中⼀般都有varchar这个数据类型。所以我得出了以下结论:
如果想在oracle新版本的数据库兼容就不要⽤varchar,如果想和oracle之外其他数据库兼容就不要⽤varchar2。
==================================================================================================
nvarchar 和 varchar 的区别是存储⽅式不同:
varchar是按字节存储的,⽽带"n"的nvarchar是按字符存储的。⽐如说 varchar(40),能存储40个字节长度的字符,存储中⽂字符的时候,因为中⽂字符1个字符就等于2个字节.所以varchar(40)只能存储20个中⽂字符.
nvarchar(40),就可以存储40个中⽂字符,也就是说可以存储80个字节长度的字符.nvarchar要相对于存储的字符类型.⽐如有些字符是占3个字节的。同样的,char和nchar也⼀样道理。char是定长的,也就是当你输⼊的字符⼩于你指定的数⽬时,char(8),你输⼊的字符⼩于8时,它会再后⾯补空值。当你输⼊的字符⼤于指定的数时,它会截取超出的字符。varchar是变长型,它的存储空间会跟你输⼊的实际字符数⽽改变,但最⼤长度不能超过你指定的长度。
nvarchar是unicode的变长型,它和char的区别很明显了,它和varchar的区别主要是存储空间⼤,相同长度下能容内更多的字符。字符集是在安装 SQL Server 时选择的,不能更改。使⽤ Unicode 数据类型,列可存储由 Unicode 标准定义的任何字符,包含由不同字符集定义的所有字符。Unicode 数据类型需要相当于⾮ Unicode 数据类型两倍的存储空间。
Unicode 数据使⽤ SQL Server 中的 nchar、varchar 和 ntext 数据类型进⾏存储。对于存储来源于多种字符集的字符的列,可采⽤这些数据类型。当列中各项所包含的 Unicode 字符数不同时(⾄多为 4000),使⽤ nvarchar 类型。当列中各项为同⼀固定长度时(⾄多为 4000个 Unicode 字符),使⽤ nchar 类型。当列中任意项超过 4000 个 Unicode字符时,使⽤ ntext 类型。
nvarchar(n): 包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储⼤⼩是所输⼊字符个数的两倍。所输⼊的数据字符长度可以为零。
varchar[(n)]:
长度为 n 个字节的可变长度且⾮ Unicode 的字符数据。n 必须是⼀个介于 1 和 8,000 之间的数值。存储⼤⼩为输⼊数据的字节的实际长度,⽽不是 n 个字节。所输⼊的数据字符长度可以为零。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。