小问题也有大学问,如有讹误,请广大网友指正
1.Oracle环境下varchar2和varchar有区别吗?
网上很多资料说Oracle环境下varchar2和varchar有很多区别,什么对null的处理啥的等等,其实他俩貌似真没区别啊,看以下例子。用varchar创建的c1字段在实际创建时仍是使用varchar2类型【为什么有这2个,是因为历史原因】。
2.Oracle环境下varchar2(n),这个n指的是字节数还是字符数?
在Oracle环境中,这个n既可能是字符数,也可能是字节数。主要取决于参数nls_length_semantics
当参数是BYTE时,指的是字节数,当参数是char时,指的是字符数【当然如果纯粹存放英文字母,这两者并无差异】,注意当参数是char时,你插入了多字节存储的字符(比如汉字),使用length函数查到的是字符的数量,而如果想查询字节数量,可使用lengthb函数。
3.Oracle究竟使用2个字节还是3个字节存放汉字?
Oracle中使用多少个字节存放汉字主要还是看使用了什么字符集,比如说我们常见的GBK字符集则通常使用2个字节来存放汉字,UTF8字符集则采用3个字节存放汉字,因此若无特殊的汉字字符的话,建议使用GBK字符集减少存储,提高性能。
4.Tbase的varchar和varchar2有什么区别?
首先,Tbase的常规模式为pg模式,根本就没有varchar2这个字符类型。
其次Tbase的Oracle模式下(创建数据库时指定sql mode = oracle)下,提供了varchar2这个数据类型,但varchar与varchar2有着明显的区别【这点和Oracle不一样】,Tbase中的varchar指的是字符的数量,varchar2指的是字节的数。
通过实际查询可以看到col1是varchar(5),实际存放了5个汉字字符,实际15个字节。
而varchar2(5)则只能存放1个汉字字符,3个字节。
5.Oracle数据库迁移到Tbase中,Tbase使用什么类型来对应Oracle数据库中varchar2类型?
oracle中采用的是字节数的话【nls_length_semantics=byte】,建议对应的tbase可以选择varchar2。
oracle中采用的是字符数的话【nls_length_semantics=char】,建议对应的tbase可以选择varchar,此时如果还选择varchr2的话,可能需要适当增加n的倍数。