Mysql 中 varchar 比较 Oracle varchar2

现在新项目上来,我做数据库开发的第一把手,在研究mysql,这里是小计,顺便记录一下,还有一个问题就是,mysql中没有varchar2 而是varchar而oracle中是varchar2是varcahr2的升级版。


MySQL和oracle做数据同步。其中表的一个字段在mysql中设置为varchar(6),Oracle中为varchar2(6)但mysql中能正常存放的数据同步到oracle中却抱ORA-12899: value too large for column错误。
这是为什么呢?


mysql中varchar(6)代表可以存放6个汉字,6个字母,或6个数字。
oracle中varchar2(6)代表可以中存放6个字节。即oracle中varchar2的长度代表字节数而不是字符数。
mysql中一个汉字占三个字节,Oracle中一个汉字占两个字节。

虽然mysql varchar 和orache varchar2中字段设置相同的长度,但oracle中却存放不下。


1.1. Mysql中新建表tmysql

1.2.插入6个汉字

1.3.可以成功插入,并查询出结果

CREATE TABLE tmysql (
   name varchar(6) DEFAULT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utfinsert into t values('北京蒙迪艾尔');
mysql> select name ,length(name)  ,char_length(name) 
 from tmysql;
 +--------------+--------------+-------------------+
 | name         | length(name) | char_length(name) |
 +--------------+--------------+-------------------+
 | 北京蒙迪艾尔 |           18 |                 6 |
 +--------------+--------------+-------------------+
 1 row in set

2.1. Oracle中新建表toracle

Oracle:
SQL> create table toracle
   2  (
   3    NAME VARCHAR2(6)
   4  );Table created

2.3 在oracle的varchar2(6)中同样插入6个汉字

SQL> insert into toracle values('北京蒙迪艾尔');
 insert into toracle values('北京蒙迪艾尔')
 ORA-12899: value too large for column "SCOTT"."TORACLE"."NAME" (actual: 12, maximum: 6)

-- 在oracle中varchar2(6)中插入6个汉字失败

SQL> select length('北京蒙迪艾尔') from dual;
 LENGTH('北京蒙迪艾尔')
 ----------------------
                     6
 SQL> insert into toracle values('蒙迪艾');
 1 row insertedSQL> select name ,length(name) from toracle;
 NAME   LENGTH(NAME)
 ------ ------------
 蒙迪艾            3   
 SQL> insert into toracle values('蒙迪艾尔');
 insert into toracle values('蒙迪艾尔')
 ORA-12899: value too large for column "SCOTT"."TORACLE"."NAME" (actual: 8, maximum: 6)

如果想让mysql varchar中存放的汉字可以在orale中varchar2中存放的下。

(因为mysql中一个汉字占三个字节,oracle中一个汉字占两个字节)。 

要存放4个汉字,mysql每1长度代表一个字符,
应该是 varchar(4) ;Oracle 每1长度代表一个字节的话,应该是 varchar2(8),算下来 Oracle的长度应该保持为Mysql的2倍才对


参考:



MySQL和oracle做数据同步。其中表的一个字段在mysql中设置为varchar(6),Oracle中为varchar2(6)但mysql中能正常存放的数据同步到oracle中却抱ORA-12899: value too large for column错误。
这是为什么呢?


mysql中varchar(6)代表可以存放6个汉字,6个字母,或6个数字。
oracle中varchar2(6)代表可以中存放6个字节。即oracle中varchar2的长度代表字节数而不是字符数。
mysql中一个汉字占三个字节,Oracle中一个汉字占两个字节。

虽然mysql varchar 和orache varchar2中字段设置相同的长度,但oracle中却存放不下。


1.1. Mysql中新建表tmysql

1.2.插入6个汉字

1.3.可以成功插入,并查询出结果

CREATE TABLE tmysql (
   name varchar(6) DEFAULT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utfinsert into t values('北京蒙迪艾尔');
mysql> select name ,length(name)  ,char_length(name) 
 from tmysql;
 +--------------+--------------+-------------------+
 | name         | length(name) | char_length(name) |
 +--------------+--------------+-------------------+
 | 北京蒙迪艾尔 |           18 |                 6 |
 +--------------+--------------+-------------------+
 1 row in set

2.1. Oracle中新建表toracle

Oracle:
SQL> create table toracle
   2  (
   3    NAME VARCHAR2(6)
   4  );Table created

2.3 在oracle的varchar2(6)中同样插入6个汉字

SQL> insert into toracle values('北京蒙迪艾尔');
 insert into toracle values('北京蒙迪艾尔')
 ORA-12899: value too large for column "SCOTT"."TORACLE"."NAME" (actual: 12, maximum: 6)-- 在oracle中varchar2(6)中插入6个汉字失败
SQL> select length('北京蒙迪艾尔') from dual;
 LENGTH('北京蒙迪艾尔')
 ----------------------
                     6
 SQL> insert into toracle values('蒙迪艾');
 1 row insertedSQL> select name ,length(name) from toracle;
 NAME   LENGTH(NAME)
 ------ ------------
 蒙迪艾            3   
 SQL> insert into toracle values('蒙迪艾尔');
 insert into toracle values('蒙迪艾尔')
 ORA-12899: value too large for column "SCOTT"."TORACLE"."NAME" (actual: 8, maximum: 6)

如果想让mysql varchar中存放的汉字可以在orale中varchar2中存放的下。

(因为mysql中一个汉字占三个字节,oracle中一个汉字占两个字节)。 

要存放4个汉字,mysql每1长度代表一个字符,
应该是 varchar(4) ;Oracle 每1长度代表一个字节的话,应该是 varchar2(8),算下来 Oracle的长度应该保持为Mysql的2倍才对