1. 程式人生 > >Mysql varchar VS Oracle varchar2

Mysql varchar VS Oracle varchar2

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
CREATE TABLE tmysql (
  name varchar(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

1.2.插入6個漢字

insert into t values('北京蒙迪艾爾');

1.3.可以成功插入,並查詢出結果

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 inserted

SQL> 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中存放的下。那麼oracle中設定varchar2的長度應該為mysql中varchar的1.5倍。
(因為mysql中一個漢字佔三個位元組,oracle中一個漢字佔兩個位元組)。