源于今天的一个工作。
把oracle中的几张表导到DB2中。
先在oracle上查出建表语句,把varchar2替换为varchar,把date替换为timestamp,把number替换为decimal,
建表在DB2上顺利完成,然后开始导数据。
一开始两张没问题,导到第三张的时候报错,
DB2 SQLCODE=-302, SQLSTATE=22001,
查了一下说是字段长度超过了定义的长度。
这种问题肯定是出在中文字符上,
因为建表语句中字段长度是一样的,那也就是说oracle中的varchar2(10)和DB2中的varchar(10)存的中文的长度是不一样的。
然后查了一下,这样说其实不严谨。
oracle和DB2中,一个中文字符占多少字节,和数据库的字符编码有关。
oracle中,如果字符编码是ZHS16GBK,那么一个中文占两个字节,varchar2(10)可以放五个汉字;
如果字符编码是AL32UTF8,那么一个中文占三个字节,varchar2(10)可以放三个汉字。
DB2中也是一样,如果是GBK, 每个汉字占2个字节。如果是UTF,则占用3个字节。
而mysql5.0之后的版本中,mysql将字符长度的单位统一为字符。
也就是说varchar(10)可以存10个汉字,但是放数字的话也只能放10个。
那MSsqlserver呢?
nvarchar(10)可以存10个汉字,
varchar(10)可以存5个汉字。
PostgreSQL呢?
varchar(10)可以存10个汉字。
附上最新的数据库流行度排名
领取专属 10元无门槛券
私享最新 技术干货