iverycd / OracleSync2MySQL

Oracle to MySQL, PolarDB, Percona Server MySQL, MariaDB, OceanBase, TiDB, GaussDB for MySQL
MIT License
43 stars 16 forks source link

表名用大写,使用自定义写入表数据会导致找不到表 #10

Open AnisJiang opened 7 months ago

AnisJiang commented 7 months ago

image

当数据库表名用大写的时候,使用自定义迁移表会显示找不到这个表.把数据库表名改成小写后就能找到了并且能写入,

iverycd commented 7 months ago

应该是在oracle创建表的时候名称用双引号包围起来了 麻烦在oracle查下下面的数据字典视图, select TABLE_NAME from user_tables where upper(table_name)=upper('表名');

iverycd commented 7 months ago

麻烦也发下出错的时候在oracle中表名称字符串以及yml配置文件中自定义表名称部分

AnisJiang commented 7 months ago

image

这个是配置,我不理解你的意思,在Oracle中表是大写,我首先是只创建表结构不导入数据,这个没有问题,但是在导入数据,有一些表导入失败,我使用手动导入数据,在Mysql 表和Oracle一样是大写的,但是我配置文件不管用大写还是小写,运行的时候,他都会转成小写,就出现找不到表了,我只能在数据库把表名改成小写,才能导入数据.

----------------------还有一个问题,在Mysql导入文本出现这个,我无法知道是哪一行数据导致的问题 image

还有一个问题,在插入文本出现这个. image

iverycd commented 7 months ago

image 这个是配置,我不理解你的意思,在Oracle中表是大写,我首先是只创建表结构不导入数据,这个没有问题,但是在导入数据,有一些表导入失败,我使用手动导入数据,在Mysql 表和Oracle一样是大写的,但是我配置文件不管用大写还是小写,运行的时候,他都会转成小写,就出现找不到表了,我只能在数据库把表名改成小写,才能导入数据. 还有一个问题,在插入文本出现这个. image

这个是在处理blob大字段类型,麻烦提供下MySQL的版本,以及大概的源库表结构

AnisJiang commented 7 months ago

我使用的Mysql是mariaDb/10.11.6版本

iverycd commented 7 months ago

我使用的Mysql是mariaDb/10.11.6版本

请问下,remark这个字段在oracle是什么数据类型

AnisJiang commented 7 months ago

VARCHAR2类型,如上次你所说,因为在Oracle中这个字段字符超过500字符,在同步到Mysql时,会导致创建表失败,所以我改成text文本类型,手动创建表

iverycd commented 7 months ago

方便的话,麻烦提供下Oracle表结构DDL语句,表名以及列字段你可以做脱敏处理, 请使用下面sql获取oracle数据字典中的表结构发我

select dbms_metadata.get_ddl('TABLE','表名','oracle连接用户名') from dual;

image

AnisJiang commented 7 months ago

CREATE TABLE "ESOURCING"."QUOTATION_DETAIL" ( "ITEM" NUMBER NOT NULL ENABLE, "SUPPLIER_ID" NUMBER NOT NULL ENABLE, "RFQ_DETAIL_ID" NUMBER NOT NULL ENABLE, "QUOTATION_ID" NUMBER NOT NULL ENABLE, "VALID_PERIOD" VARCHAR2(500), "VTECH_P_N" VARCHAR2(1000), "DESCRIPTION" VARCHAR2(2000), "MANUFACTURER" VARCHAR2(1000), "ORDERING_NO" VARCHAR2(100), "USAGE" VARCHAR2(100), "TARGET_PRICE" FLOAT(126), "CURRENCY" VARCHAR2(100), "TRADE_PRICES" FLOAT(126), "TOOLING" VARCHAR2(500), "L_T" VARCHAR2(100), "CW" VARCHAR2(100), "RW" VARCHAR2(100), "SPQ" VARCHAR2(100), "MOQ" VARCHAR2(100), "ATTACHED_DRAWING" VARCHAR2(2000), "DRAWING_NOS" NUMBER, "REJECT_QUOTE" VARCHAR2(1000), "REJECT_REASON" VARCHAR2(2000), "REMARK" VARCHAR2(2000), "PAYMENT_TERM" VARCHAR2(1000), "PAYMENT_TERM_DETAILS" VARCHAR2(2000), "PAYMENT_METHOD_DETAILS" VARCHAR2(2000), "REQUOTE_ITEM" NUMBER DEFAULT 0, "STATUS" VARCHAR2(100), "SUPPLIER_SUGGESTEDPN" VARCHAR2(1000), "SUPPLIER_SUGGESTEDMFT" VARCHAR2(1000), "MANUFACTURERPN" VARCHAR2(1000), "QUOTED_PRICE" NUMBER DEFAULT 0, "GROUP_NO" VARCHAR2(100), "REJECT" NUMBER DEFAULT 0, "QUOTED_PRICE2" FLOAT(126) DEFAULT 0, "QUOTED_PRICE3" FLOAT(126) DEFAULT 0, "QUOTED_PRICE4" FLOAT(126) DEFAULT 0, "QUOTED_PRICE5" FLOAT(126) DEFAULT 0, "QUOTED_PRICE6" FLOAT(126) DEFAULT 0, "IS_SELECT" NUMBER DEFAULT 0, "QUOTE_DATE" DATE, "QUOTE_BY" VARCHAR2(100), "SELECT_REMARK" VARCHAR2(2000), "GENERATERFQ_DATE" TIMESTAMP (6), "VTECH_TARGET_PRICE" FLOAT(126) DEFAULT 0, "CUSTOMER_TARGET_PRICE" FLOAT(126) DEFAULT 0, "ALLOW_HIGH_PRICE" NUMBER DEFAULT 0, "MATERIAL_GROUP" VARCHAR2(100), "STATUS2" VARCHAR2(100), "CREATE_BY" VARCHAR2(50), "CREATION_DATE" TIMESTAMP (6), "MODIFIED_BY" VARCHAR2(50), "MODIFIED_DATE" TIMESTAMP (6), "SP_NTF_SENT_DATE" TIMESTAMP (6), "SP_RMR_SENT_DATE" TIMESTAMP (6), "LW_N" NUMBER, "CW_N" NUMBER, "RW_N" NUMBER, "SPQ_N" FLOAT(126), "MOQ_N" FLOAT(126), "TOOLING_N" FLOAT(126), "VERSION" NUMBER, "ITEM_NO" VARCHAR2(100), "NOTIFIED" NUMBER DEFAULT 1 NOT NULL ENABLE, "INCOTERM" VARCHAR2(100), "SA_SUPPLIER" NUMBER DEFAULT 0, PRIMARY KEY ("ITEM") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "ESOURCING" ENABLE, CONSTRAINT "FK_QUOTATION_DETAIL_SUPPLIER" FOREIGN KEY ("SUPPLIER_ID") REFERENCES "ESOURCING"."SUPPLIER" ("SUPPLIER_ID") ENABLE, CONSTRAINT "FK_QUOTATION_HEADER_ID" FOREIGN KEY ("QUOTATION_ID") REFERENCES "ESOURCING"."QUOTATION_HEADER" ("ID") ON DELETE CASCADE ENABLE ) SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "ESOURCING"

iverycd commented 7 months ago

麻烦把MySQL的text类型改成longtext类型试试

AnisJiang commented 7 months ago

image 还是不行,爆出这个错误.

AnisJiang commented 7 months ago

@iverycd 我Clone你的代码在Win10下面编译,没有改动代码重新编译运行,执行没有报错,数据已经同步正常,感谢你的工具分享,你的工具应该是Linux下编译的?执行就出现问题了?

iverycd commented 7 months ago

@iverycd 我Clone你的代码在Win10下面编译,没有改动代码重新编译运行,执行没有报错,数据已经同步正常,感谢你的工具分享,你的工具应该是Linux下编译的?执行就出现问题了?

感谢您提供的表结构,可惜我在本地环境无法复现,后期会对此issue进行深度分析 由于连接Oracle需要使用godror这个库,他不支持跨平台交叉编译,所以我在每个平台上的操作系统上进行了独立编译,Windows编译环境是Win 11 22H2

iverycd commented 7 months ago

@AnisJiang 问题我复现出来了,跟golang的编译平台无关,原因是在于MySQL数据库字符集使用了uft8字符集或者列字段属性设置了utf8,之前我个人的环境一直都是utf8mb4,所以没遇到此类问题。另外还是十分感谢您的提问,有啥问题我都会尽快处理

问题场景复现:

image

问题排查思路:

1、报错中的16进制字符串,解码之后为字符􀀊

Oracle数据库内16进制转字符串SQL
select sys.UTL_raw.cast_to_varchar2('F480808A') from dual;

MySQL数据库内16进制转字符串SQL
select CONVERT(0xF480808A USING utf8mb4);

image

2、字符􀀊不能存储在utf8字符集的库或者列字段内 原因如下: MySQL 中 utf8 的全名应该叫——utf8mb3(max byte 3),其编码的最大字符能存储为 3 字节 而字符􀀊占用了4字节F480808A

在 5.5.3 版本中,MySQL 添加了对 utf8mb4 编码的支持,最大字符长度可存储大小为四字节,也就是说 utf8mb4 才是我们传统意义上的 UTF-8

3、解决方法,库更改为utf8mb4或者列字段属性改为utf8mb4 image

image