资讯详情

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

笔记

oracle代码改为mysql,java程序数据库oracle改为mysql需要更改哪些代码?如何更改?

有三个地方需要修改:1。数据库驱动包,改为ojdbc-*.jar,2.将修改配置文件driver、url、3.数据访问层的修改主要体现在用户名和密码的修改上SQL语句  一、数据库驱动包:  二、配置文件:  三、数据访问层(也是最麻烦的地方)  (2)自增方式,oracle需要创建序列,使用语句:序列名:.nextval。如果你的java使用框架,例如hibernate,需要对id重新配置标签,添加自增序列说明。如果你的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

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

开发 和 测试 包里面都要改

在这里插入图片描述

prod 开发环境 test 测试环境

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

注意: 我们测试环境更开发 环境用的库不一定相同 所以测试的时候 不一定用的同一个库 本地的在

测试的在这里

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

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

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

??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 是否是字符串, 

标签: psg3m磁感应传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台