数据库设计字段类型参考
Unicode字符集就是为了解决字符集这种不兼容的问题⽽产⽣的,它所有的字符都⽤两个字节表⽰,即英⽂字符也是⽤两个字节表⽰
如果还为了这个纠结,就直接看看后⾯的解说,做决定吧。
⼀般如果⽤到中⽂或者其它特殊字符,我就会使⽤n开头的类型,否则的话直接使⽤var开头的。 在
oracle中,N开头的类型是每个字符固定2个长度
以2结尾的类型是变长字符串,以实际长度存储
Oracle中nvarchar2和varchar2的共同点:
1、NVARCHAR2中存储中⽂字时,⼀个中⽂字当⼀个字符来处理
NVARCHAR2(10)是可以存进去10个汉字的,如果⽤来存英⽂也只能存10个字符。
2、⽽VARCHAR2中⼀个中⽂字当两个字符来处理
VARCHAR2(10)的话,则只能存进5个汉字,英⽂则可以存10个
3、CHAR(size)和NCHAR(size)的区别
CHAR如果存放字母数字占1个字节,存放GBK编码的汉字存放2个字节,存放UTF-8编码的汉字占⽤3个字节;
NCHAR以字符存储,⼀个汉字占⼀个
sql server中的varchar和Nvarchar有什么区别?
答:
varchar(n)
长度为 n 个字节的可变长度且⾮ Unicode 的字符数据。n 必须是⼀个介于 1 和 8,000 之间的数值。存储⼤⼩为输⼊数据的字节的实际长度,⽽不是 n 个字节。
nvarchar(n)
包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储⼤⼩是所输⼊字符个数的两倍。
两字段分别有字段值:我和coffee
那么varchar字段占2×2+6=10个字节的存储空间,⽽nvarchar字段占8×2=16个字节的存储空间。
如字段值只是英⽂可选择varchar,⽽字段值存在较多的双字节(中⽂、韩⽂等)字符时⽤nvarchar
联机帮助上的:
char(n) 定
长
索引效率⾼ 程序⾥⾯使⽤trim
去除多余的空⽩
n 必须是⼀个介于 1 和 8,000 之间的数值,存储⼤⼩为 n 个字节
varchar(n)变
长
效率没char⾼ 灵活
n 必须是⼀个介于 1 和 8,000 之间的数值。存储⼤⼩为输⼊数
据的字节的实际长度,⽽不是 n 个字节
text(n)变
长
⾮Unicode数据
nchar(n)定
长
处理unicode数据类型(所有的
字符使⽤两个字节表⽰)
n 的值必须介于 1 与 4,000 之间。存储⼤⼩为 n 字节的两倍
nvarchar(n)变
长
处理unicode数据类型(所有的
字符使⽤两个字节表⽰)
n 的值必须介于 1 与 4,000 之间。字节的存储⼤⼩是所输⼊字
符个数的两倍。所输⼊的数据字符长度可以为零
nvarchar(n)
长字符使⽤两个字节表⽰)符个数的两倍。所输⼊的数据字符长度可以为零
ntext(n) 变
长
处理unicode数据类型(所有的
字符使⽤两个字节表⽰)
出处:
varchar2最大长度⼀般来说,如果含有中⽂字符,⽤nchar/nvarchar,如果纯英⽂和数字,⽤char/varchar 这⾥总结的不错
很多开发者进⾏数据库设计的时候往往并没有太多的考虑char, varchar类型,有的是根本就没注意,因为存储价格变得越来越便宜了,忘记了最开始的⼀些基本设计理论和原则,这点让我想到了现在的年轻⼈,⼤⼿⼀挥⼀把⼈民币就从他⼿⾥溜⾛了,其实我想不管是做⼈也好,做开发也好,细节的把握直接决定很多东西。当然还有⼀部分⼈是根本就没弄清楚他们的区别,也就随便选⼀个。在这⾥我想对他们做个简单的分析,当然如果有不对的地⽅希望⼤家指教。
1、CHAR。CHAR存储定长数据很⽅便,CHAR字段上的索引效率级⾼,⽐如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不⾜的⾃动⽤空格填充,所以在读取的时候可能要多次⽤到trim()。
2、VARCHAR。存储变长数据,但存储效率没有CHAR⾼。如果⼀个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度
是它的值的实际长度+1。为什么“+1”呢?这⼀个字节⽤于保存实际使⽤了多⼤的长度。从空间上考虑,⽤varchar合适;从效率上考虑,⽤char合适,关键是根据实际情况到权衡点。
3、TEXT。text存储可变长度的⾮Unicode数据,最⼤长度为2^31-1(2,147,483,647)个字符。
4、NCHAR、NVARCHAR、NTEXT。这三种从名字上看⽐前⾯三种多了个“N”。它表⽰存储的是Unicode数据类型的字符。我们知道字符中,英⽂字符只需要⼀个字节存储就⾜够了,但汉字众多,需要两个字节存储,英⽂与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题⽽产⽣的,它所有的字符都⽤两个字节表⽰,即英⽂字符也是⽤两个字节表⽰。nchar、nvarchar的长度是在1到4000之间。和char、varchar⽐较起来,nchar、nvarchar则最多存储4000个字符,不论是英⽂还是汉字;⽽char、varchar最多能存储8000个英⽂,4000个汉字。可以看出使⽤nchar、nvarchar数据类型时不⽤担⼼输⼊的字符是英⽂还是汉字,较为⽅便,但在存储英⽂时数量上有些损失。
所以⼀般来说,如果含有中⽂字符,⽤nchar/nvarchar,如果纯英⽂和数字,⽤char/varchar
我把他们的区别概括成:
CHAR,NCHAR 定长,速度快,占空间⼤,需处理
VARCHAR,NVARCHAR,TEXT 不定长,空间⼩,速度慢,⽆需处理
NCHAR、NVARCHAR、NTEXT处理Unicode码
下⾯到⼀段资料,来源
varchar在SQL Server中是采⽤单字节来存储数据的,nvarchar是使⽤Unicode来存储数据的.中⽂字符存储到SQL Server中会保存为两个字节(⼀般采⽤Unico编码),英⽂字符保存到数据库中,如果字段的类型为varchar,则只会占⽤ ⼀个字节 ,⽽如果字段的类型为nvarchar,则会占⽤ 两个字节 .
正常情况下,我们使⽤varchar 也可以存储中⽂字符 ,但是如果遇到操作系统是英⽂操作系统并且对中⽂字体的 ⽀持不全⾯时 , 在SQL Server存储中⽂字符为varchar就会出现乱码(显⽰为??).⽽且正常情况下,主机都会⽀持中⽂的环境,所以如果使⽤varchar来存储数据,在开发阶段是发现不了的.多数情况下,在 布署
当然,使⽤nvarchar存储英⽂字符会增⼤⼀倍的存储空间.但是在存储代价已经很低廉的情况下,优先考虑兼容性会给你带来更多好处的.
所以在Design的时候应该尽量使⽤nvarchar来存储数据.只有在你确保该字段不会保存中⽂的时候,才采⽤varchar来存储. 的时候也不会有问题.
但是!如果布署的主机是英⽂操作系统,并且不⽀持中⽂环境,那问题就出来了.所有的varchar字段在存储中⽂的时候都会变成乱码(显⽰为??).⽽且⼀般情况下你不会知道这是因为你采⽤了错误的数据类型来存储所造成的,你会试着去装中⽂字体,试着去设置操作系统的语⾔环境...这些都不能解决问题,唯⼀能解决问题的是把数据库字段的类型个性为nvarchar(或者nchar).对项⽬管理⽐较熟悉的朋友应该都知道,到布署阶段再来修改数据库是⼀个很恐怖的事情.
使⽤nvarchar的另⼀个⾮常好处就是在判断字符串的时候可以不需要考虑中英⽂两种字符的差别.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论