mysql到oracle複製的注意點

首先檢討一下自己,上個月只寫了兩篇博客!!!!這個月繼續努力!!!!這個月準備學一學hadoop,hbase方面的~~

最近在做一個mysql到oracle的複製項目,使用的是公司的軟件,在測試過程中發現了一些複製過程中需要注意的地方,這裏做一個記錄,我會不定時更新這篇文章

1.mysql和oracle對於char,varchar的存儲方式不同

在mysql中varchar(N),和char(N)可以存儲N個字符,是字符而不是字節,例如當N爲10的時候,我們就可以插入一個

mysql> desc t1;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| name  | varchar(5) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t1;
+-----------------+
| name            |
+-----------------+
| 你好啊啊啊 |
+-----------------+
1 row in set (0.00 sec)
而在oracle中,對於一個varchar2(N)中的N爲字節數,當字符編碼爲gbk的時候只能輸入每個漢字要佔用2個字節.那麼對於varchar2(5)就只能輸入2個漢字

SQL> desc t1;
 Name					   Null?    Type
 ----------------------------------------- -------- ----------------------------
 NAME						    VARCHAR2(5)
SQL> insert into t1 values('你好啊'); 
ERROR at line 1:
ORA-12899: value too large for column "SUQ"."T1"."NAME" (actual: 6, maximum: 5)

對於這種可以轉換爲oracle中nvarchar或者varchar2(n char)這兩中數據格式.

例外還要注意mysql中varchar的最大長度爲65535,而oracle中只有4000,對於varchar大於4000的在oracle中要轉換爲clob.


2.mysql和oracle對錶名,字段名,索引名的長度限制不同

在mysql中表名,字段名,索引名的長度限制爲64個字符,而oracle中是30個字符,因此在設計表的時候就要注意不要把這些名字搞的過長.


3.mysql和oracle中的索引所屬不同

在mysql中的索引是在表下面的,對於同一張表下的索引名字必須不同,但是在同一個數據庫下的不同表下索引的名字可以是相同的,

但是在oracle中的索引是在schema下的,因此如果從mysql同步到oracle中就有可能出現名字衝突的現象.

mysql> create table t2(id int,key idx_1 (id));
Query OK, 0 rows affected (0.04 sec)

mysql> create table t3(id int,key idx_1 (id));
Query OK, 0 rows affected (0.04 sec)

4.mysql和oracle中字符集的問題

在mysql中字符集的設置相當靈活,可以對數據庫,表,字段設置字符集.

而在oracle中只能設置數據庫的字符集.那麼在同步的時候就會遇到字符集的轉換問題,特別的當數據庫和表,表和字段的字符集不同的時候,同步到oracle的時候就相當難轉換.

因此推薦在設計表的時候儘量設置爲統計的字符集.


5.mysql和oracle大小寫問題

在mysql中默認是區分大小寫的.而在oracle中是不區分大小寫的,在同步的時候就要注意,具體的還是要和應用溝通好在oracle端一般怎麼查詢,具體情況具體設置.


6.mysql中varchar,char對行尾的空格處理

在mysql中,當你使用char或者varchar作爲字段類型的時候,如果再字段值的末尾包含空格,mysql會自動將空格去除.

而在oracle中不會去除的,那麼如果oracle中有一個字段值如下:

name

------

bob(空格)

bob

而且這個字段有唯一索引,那麼複製到mysql中的時候就會報錯,違反主鍵約束,因爲mysql中會自動將第一條數據中的空格刪除,從而導致和第二條數據一致.

解決辦法,是oracle中varchar2在mysql中可以使用varbinary來代替.mysql中varbinary類型表示字節.因爲末尾空格也是佔用字節的所以不會刪除.但是這樣有可能導致一個字符長度的問題.

因爲oracle中我們一般使用zhsgbk,如果再mysql中使用utf8,而且使用varbinary類型,那麼就很有可能導致長度不夠.具體原因就是utf8和gbk佔用的字節數不一致導致.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章