Oracle改为 mysql 中出现的问题 和注意事项

笔记

oracle代码改为mysql,java程序数据库oracle改为mysql需要改动哪些代码?怎么改?

主要需要修改的有三个地方:1.数据库驱动包,改为ojdbc-*.jar,2.配置文件修改,将driver、url、用户名和密码修改,3.数据访问层的修改,主要体现在SQL语句

一、数据库驱动包:

二、配置文件:

三、数据访问层(也是最麻烦的地方)

(2)自增方式,oracle需要创建序列,在语句中使用:序列名.nextval。如果你的java用到了框架,譬如hibernate,需要对id标签进行重新配置,加入自增序列的说明。

mysql的substring,oracle用substr处理。

去空,mysql只有trim,oracle有trim,ltrim,rtrim多种选择。

字符串长度,mysql是char_length(),oracle是length。

INSTR函数的参数个数,oracle多一个 ,使之可以从非1的位置开始执行:INSTR('abcd','a',2)。

mysql的if...case语句可以用oracle的decode函数代替。(5)oracle的SQL语句在书写上要求严格,譬如查询语句中,GROUP BY分组,mysql可以返回除分组字段外的其他字段的值,oracle不允许。

(6)mysql允许使用双引号操作字符串,oracle只能用单引号,程序内需要预先转换。

(7)如果脱离库表,oracle的查询或计算,需要使用虚拟表DUAL,譬如SELECT ASCII('A') VALUE FROM DUAL;

(10)oracle没有group_concat;

(11)oracle的表名后面不能用as。

分页方式

mysql使用limit,oracle使用rownum。

函数

mysql的ifnull()对应oracle的nvl()

mysql的now()对应oracle的sysdate或systimestamp,可以在sysdate上直接使用运算符计算。

主键

  • oracle主键为 number 类型,不支持自增

  • 转为 mysql 后自动为 decimal 类型,此类型不能设置为自增

  • 需要设置主键自增,手动将mysql主键改为int类型

字符串

  • varchar2以下转为 varchar 类型,长度不变(oracle字节数在255以内)

  • varchar2以下转为 text 类型,字节数超过255自动变为text

日期类型

Date类型转为datetime类型

(1) 取时间

oracle中sysdate,获取系统本地时间。mysql中,now()函数。

oracle的时间,使用类似TO_DATE(‘2018-04-03 13:01:32’,‘YYYY-MM-DD HH24:MI:SS’)的方式表示。

mysql的date_format和time_format,oracle可以用类似TO_CHAR(sysdate,‘YYYY-MM-DD HH24:MI:SS’)

索引相关

  • mysql 单列索引最长为767字节,字符最大为191个字符(varchar(191))
  • oracle中索引超过191字符,转换失败,可手动改索引的长度

concat()函数

oracle中concat函数中只能两个参数,concat(str1,str2);而mysql中能放多个参数concat(str1,str2,…)

格式化时间

oracle:

select to_date(‘1999-01-01 00:00:00’,‘yyyy-mm-dd hh24:mi:ss’) from dual;

select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss’) from dual;

mysql:

SELECT DATE_FORMAT(NOW(),‘%y-%c-%d %h:%i:%s’);

SELECT STR_TO_DATE(‘2000-01-01 00:00:00’, ‘%Y-%m-%d %h:%i:%s’);

大字段转换字符

oracle中可用to_char()进行转换;

'||'符号 拼接

Oracle中可以用 || 符号用于连接字符,例:

SELECT ‘A’||‘,’||‘B’ AS ZHI FROM DUAL

输出值为 “A,B”,而MySQL是表示或的意思,等同于"or"。

concat函数,oracle只能拼接两个,因此要么两两拼接,要么换成||拼接。

表连接

(1)select e.empno,e.ename,d.dname from emp e,dept d where e.DEPTNO = d.DEPTNO(+);

(2)select e.empno,e.ename,d.dname from emp e left join dept d on e.DEPTNO = d.DEPTNO;

表连接一般有以上两种方式,Oracle两种方式都给与了支持,但mysql只支持第二种方式。

判空

mysql允许使用!=null,oracle使用is not null

判空

mysql允许使用!=null,oracle使用is not null

insert语句

mysql可以连续,oracle不可以连续:

mysql:insert into 表 values(…),(…),(…);

oracle:insert into 表 values(…);

基本概念:

DDL (Data Definition Language) 语句: 数据定义语言 , 主要是进行定义/改变表的结构、数据类型、表之间的链接等操作。常用的语句关键字有 CREATE、DROP、ALTER 等。

CREATE TABLE 表名(
列名1 数据类型,
列名2 数据类型,
列名3 数据类型,
...
)

ALTER TABLE 表名;
eg:ALTER TABLE 表名 ADD 列名 数据类型;(添加一个列)
    ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;(修改列名)
    ALTER TABLE 表名 DROP 列名;

DROP TABLE 表名;
DROP DATABASE 数据库名;

DML(Data Manipulation Language)语句: 数据操纵语言,主要是对数据进行增加、删除、修改操作。常用的语句关键字有 INSERT、UPDATE、DELETE 等。

INSERT INTO 表名 (字段1,字段2,...) values (某值,某值,...),(某值,某值,...);

UPDATE 表名 SET 列名=新值 WHERE 限定条件;

DELETE FROM 表名 WHERE 限定条件;

建表后面 auto_increment 什么意思?

mysql的创建表的语句后面有auto_increment=120

DDL

CREATE TABLE `insurance_claim_luggage_old` (
  `claim_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '理赔主键',
  `claim_no` varchar(65) NOT NULL COMMENT '理赔单号',
  `status` decimal(2,0) NOT NULL COMMENT '理赔状态',
  `report_no` varchar(30) DEFAULT NULL COMMENT '报案号',
  `claim_amounts` decimal(11,2) DEFAULT NULL COMMENT '理赔金额',
  `case_status` decimal(2,0) DEFAULT NULL COMMENT '理赔案件状态',
  `apply_date` datetime NOT NULL COMMENT '申请日期',
  `refund_date` datetime DEFAULT NULL COMMENT '退款日期',
  `report_result_desc` varchar(250) DEFAULT NULL COMMENT '报案结果描述',
  `pay_result_desc` varchar(250) DEFAULT NULL COMMENT '支付提交结果描述',
  `claim_audit_conclusion` varchar(250) DEFAULT NULL COMMENT '理赔审核结论',
  `order_no` varchar(20) DEFAULT NULL COMMENT '订单号',
  `ticket_no` varchar(20) DEFAULT NULL COMMENT '客票号',
  `segorder` int(11) DEFAULT NULL COMMENT '航段序号',
  `passenger_name` varchar(80) NOT NULL COMMENT '旅客姓名',
  `payee_name` varchar(80) DEFAULT NULL COMMENT '银行户名(领款姓名)',
  `payee_mobile` varchar(15) DEFAULT NULL COMMENT '手机号码',
  `self_payee` decimal(1,0) DEFAULT NULL COMMENT '本人领款',
  `flight_status` varchar(5) DEFAULT NULL COMMENT '航班状态',
  `luggage_loss` decimal(1,0) DEFAULT NULL COMMENT '行李是否损失',
  `luggage_delay` decimal(1,0) DEFAULT NULL COMMENT '行李是否延误',
  `bookuser` varchar(38) DEFAULT NULL COMMENT '订单用户',
  `idcard` varchar(80) DEFAULT NULL COMMENT '证件号码',
  `idtype` varchar(10) DEFAULT NULL COMMENT '证件类型',
  `payee_relation` varchar(5) DEFAULT NULL COMMENT '领款人与被保人关系(关系编码)',
  PRIMARY KEY (`claim_id`) USING BTREE,
  UNIQUE KEY `pk_insurance_claim_luggage_old` (`claim_id`),
  UNIQUE KEY `uq_insurance_claim_luggage_old` (`claim_no`),
  UNIQUE KEY `idx_ins_claim_luggage_old_orderno` (`order_no`),
  KEY `idx_ins_claim_luggage_old_ticketno` (`ticket_no`),
  KEY `idx_ins_claim_luggage_old_psgname` (`passenger_name`),
  KEY `idx_ins_claim_luggage_old_bookuser` (`bookuser`),
  KEY `idx_ins_claim_luggage_old_psg` (`idcard`,`idtype`,`passenger_name`)
) ENGINE=InnoDB AUTO_INCREMENT=120 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='行李理赔表'

主键自增

添加索引,组合索引

AUTO_INCREMENT=n命令来重设自增的起始值。

但是如果设置的n比目前的数值小的话,执行的sql不会报错,但是不会生效!

1.ENGINE=INNODB:将数据库的引擎设置为InnoDB(mysql中两种数据库引擎 :MyISAM 、InnoDB)

2.AUTO_INCREMENT=1:自动增长的起始值为1

3.DEFAULT CHARSET=utf8:设置数据库的默认字符集为utf8

这里是创建语句,记住每一个create table 都是一个语句,不要嵌套在里面。


CREATE TABLE `insurance_claim_refund_old` (
  `claim_id` int(12) NOT NULL AUTO_INCREMENT COMMENT '理赔主键',
  `claim_no` varchar(20) NOT NULL COMMENT '理赔单号',
  `status` decimal(2,0) NOT NULL COMMENT '理赔状态',
  `report_no` varchar(30) DEFAULT NULL COMMENT '报案号',
  `claim_amounts` decimal(11,2) DEFAULT NULL COMMENT '理赔金额',
  `case_status` decimal(2,0) DEFAULT NULL COMMENT '理赔案件状态',
  `apply_date` datetime NOT NULL COMMENT '申请日期',
  `refund_date` datetime DEFAULT NULL COMMENT '退款日期',
  `refund_poundage` decimal(11,2) DEFAULT NULL COMMENT '退票或变更手续费',
  `report_result_desc` varchar(250) DEFAULT NULL COMMENT '报案结果描述',
  `pay_result_desc` varchar(250) DEFAULT NULL COMMENT '支付提交结果描述',
  `claim_audit_conclusion` varchar(250) DEFAULT NULL COMMENT '理赔审核结论',
  `order_no` varchar(20) DEFAULT NULL COMMENT '订单号',
  `ticket_no` varchar(20) DEFAULT NULL COMMENT '客票号',
  `segorder` int(11) DEFAULT NULL COMMENT '航段序号',
  `passenger_name` varchar(80) NOT NULL COMMENT '旅客姓名',
  `payee_name` varchar(80) DEFAULT NULL COMMENT '银行户名(领款姓名)',
  `payee_mobile` varchar(15) DEFAULT NULL COMMENT '手机号码',
  `self_payee` decimal(1,0) DEFAULT NULL COMMENT '本人领款',
  `bookuser` varchar(38) DEFAULT NULL COMMENT '订单用户',
  `idcard` varchar(80) DEFAULT NULL COMMENT '证件号码',
  `idtype` varchar(10) DEFAULT NULL COMMENT '证件类型',
  `payee_relation` varchar(5) DEFAULT NULL COMMENT '领款人与被保人关系(关系编码)',
  PRIMARY KEY (`claim_id`)
) ENGINE=InnoDB AUTO_INCREMENT=189 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='退改理赔表';

 CREATE UNIQUE INDEX pk_insurance_claim_refund_old ON insurance_claim_refund_old (claim_id)
 CREATE UNIQUE INDEX uq_insurance_claim_refund_old ON insurance_claim_refund_old (claim_no)
 CREATE INDEX idx_ins_claim_refund_orderno ON insurance_claim_refund_old (order_no)
 CREATE INDEX idx_ins_claim_refund_ticketno ON insurance_claim_refund_old (ticket_no)
 CREATE INDEX idx_ins_claim_refund_psgname ON insurance_claim_refund_old (passenger_name)
 CREATE INDEX idx_ins_claim_refund_bookuser ON insurance_claim_refund_old (bookuser)
 CREATE INDEX idx_ins_claim_refund_passenger ON insurance_claim_refund_old (idcard,idtype,passenger_name)

oracle 创建索引 栗子

2.创建索引
create index 索引名称 on 表名 (字段名称);
3.删除索引
drop index 索引名; 
4.创建组合索引
create index 索引名 on 表名(列名1,,列名2);
5.在数据库中查找表名
select * from user_tables where  table_name like 'tablename%';
6.查看该表的所有索引
select * from all_indexes where table_name = 'tablename';
7.查看该表的所有索引列
select* from all_ind_columns where table_name = 'tablename';
8.唯一索引 --unique   --[] 表示可选
create [unique] index 字段名称   

修改索引只能先删除,在重新建立。

oracle 下的主键自增

@Entity
@Table(name = "insurance_claim_delay_old")
public class InsuranceClaimDelay extends AbstractInsuranceClaim {
	
	/** 理赔主键 */
	@Id
	@Column(name = "claim_id")
	@SequenceGenerator(name = "INSURANCE_CLAIM_DELAY_GENERATOR", sequenceName = "SEQ_INSURANCE_CLAIM_DELAY", allocationSize = 1)
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "INSURANCE_CLAIM_DELAY_GENERATOR")
	private BigInteger claimId;

oracle 改为 mysql主键自增该法 该过之后

@SuppressWarnings("serial")
@Entity
@Table(name = "insurance_claim_attached_old")
public class InsuranceClaimAttached implements Serializable {
	
	/** 资料主键 */
	@Id
	@Column(name = "attach_id")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private BigInteger attachId;

多数据源

oracle 改为mysql

spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.autoReconnect=true
spring.jpa.hibernateuse-new-id-generator-mappings=true

开发 和 测试 包里面都要改

Oracle改为 mysql 中出现的问题 和注意事项_第1张图片

prod 开发环境
test 测试环境

需要创建的表的sql 就是我们的DDL

注意: 我们测试环境更开发 环境用的库不一定相同 所以测试的时候 不一定用的同一个库 本地的在
Oracle改为 mysql 中出现的问题 和注意事项_第2张图片

测试的在这里

Oracle改为 mysql 中出现的问题 和注意事项_第3张图片

关于不是主键唯一约束,添加不进去可能是 这个值为外键,只有在原表里面有这个数据,这张表才可以添加。

可以发生链结构,多个表互为外键。

数据库插入数据出现中文乱码?

??GM 查数据库定位为中文乱码问题

乱码的问题我看了下是因为mysql-connector-java驱动包8.0.13以前的版本需要在配置mysql连接上指定characterEncoding=UTF-8默认是utf8mb3,   8.0.13及以后的版本才是utf8mb4,  我把这jar包改到跟数据库上面的8.0.17版本就可以了
//getTime 方法返回一个整数值,这个整数代表了从 1970 年 1 月 1 日开始计算到 Date 对象中的时间之间的毫秒数。

Java中getTime()返回的是毫秒单位的long数据。因此,在转换为时间时需要注意。
日期格式大小写需要注意,不对的话,结果不是想要的 不能随意更换大小写
 @Test
    public void testup() {
        try {
            InsuranceClaimAttached attached = new InsuranceClaimAttached();
            attached.setUploadtime(new Date());
            attached.setAttachType(11);
            //BigInteger类型 将int类型转化为biginteger
            attached.setClaimId(BigInteger.valueOf(665));
            attached.setUuid("uuid测试233");
            attached.setAttachPath("adffeqaf.txt");
            insuranceClaimAttachedRepository.save(attached);
            List<InsuranceClaimAttached> list = insuranceClaimAttachedRepository.findByUuid("uuid测试233");
            Date uploadtime = list.get(0).getUploadtime();
            long time = uploadtime.getTime();
            System.out.println(time);
            String format = new SimpleDateFormat("yyyy-MM-dd hh-MM-ss").format(uploadtime);
            System.out.println(format);
        }catch (Exception e){

        }

    }

控制台打印
    
Hibernate: insert into insurance_claim_attached_old (attach_path, attach_type, attach_xh, claim_id, claim_type, uploadtime, uuid) values (?, ?, ?, ?, ?, ?, ?)
Hibernate: select insurancec0_.attach_id as attach_i1_0_, insurancec0_.attach_path as attach_p2_0_, insurancec0_.attach_type as attach_t3_0_, insurancec0_.attach_xh as attach_x4_0_, insurancec0_.claim_id as claim_id5_0_, insurancec0_.claim_type as claim_ty6_0_, insurancec0_.uploadtime as uploadti7_0_, insurancec0_.uuid as uuid8_0_ from insurance_claim_attached_old insurancec0_ where insurancec0_.uuid=?
1656382901000
2022-06-28 10-06-41

StringUtils.hasText()作用 
如果里面的值为null,"","   ",那么返回值为false;否则为true
 @Test
    public void test() {
            //无空格
            System.out.println(StringUtils.isEmpty(""));//是否为空,空返回true
            System.out.println(StringUtils.hasText(""));//是否为空,空返回false
            //有空格
            System.out.println(StringUtils.isEmpty(" "));
            System.out.println(StringUtils.hasText(" "));
            //任意字符
            System.out.println(StringUtils.isEmpty(" ' "));
            System.out.println(StringUtils.hasText(" '' "));
            System.out.println(StringUtils.isEmpty(" 1 "));
            System.out.println(StringUtils.hasText(" 2 "));
    }
控制台打印
true
false
false
false
false
true
false
true
    
    hasText 是否是字符串,null 空格不算, 是为true,否为false
    isEmpty: null 和 '' 两者选一 为空 
//ParseException 无法解析的日期异
protected Date parseDate(String dateString) {
		try {
			return dateFormat.parse(dateString);
		} catch (ParseException e) {
			// 日期解释错误
			return null;
		}
	}

“));
System.out.println(StringUtils.hasText(” ‘’ “));
System.out.println(StringUtils.isEmpty(” 1 “));
System.out.println(StringUtils.hasText(” 2 "));
}
控制台打印
true
false
false
false
false
true
false
true

hasText 是否是字符串,null 空格不算, 是为true,否为false
isEmpty: null 和 '' 两者选一 为空 





```java
//ParseException 无法解析的日期异
protected Date parseDate(String dateString) {
		try {
			return dateFormat.parse(dateString);
		} catch (ParseException e) {
			// 日期解释错误
			return null;
		}
	}

你可能感兴趣的:(mysql,java,oracle,mysql,数据库)