mysql开发中遇到的问题解决

刚接触mysq,在开发过程中遇到的问题记录,避免采坑

1.将null存为一个空格

-- mysql 对空格不敏感且认为''空字符串与null不同(处理的时候,先将null转为'',然后再用IF函数,将空字符串''转为' '空格)
SELECT if(ifnull(product_id,'')='',' ',product_id) from  audit_action;

2.GROUP_CONCAT最大长度的限制

// 查询 
SELECT @@global.group_concat_max_len;
SET GLOBAL group_concat_max_len=102400;
//会话级
SET SESSION group_concat_max_len = 102400;

3.union all 提示 Illegal mix of collations for operation ‘UNION’

-- CAST() 函数
```select cast(concat('delete from TMP1  WHERE  scope_id in  ( \'',scope_id,'\');' )as char) from TMP1  WHERE is_sync=2 
union all
  select cast(concat('delete from TMP2  WHERE  scope_id in  ( \'',scope_id,'\');' )as char) from TMP2  WHERE is_sync=2 ;

4.oracle到mysql的dblink问题,该方式并不推荐,这边因为数据同步踩坑做个记录

语法:select “member_id”,“model_id” from “model”@beehub
可能遇到问题:
无法通过dblink 实现双端数据同步:
1.long类型问题,oracle的bug
通过oracle网关查询mysql的表,mysql表有多个text,varchar(1024)之类的大文本字段,oracle都会转化为long类型,
此时只能一个字段一个字段查询,否则会出现ORA-00600: 内部错误代码, 参数: [HO define: Long fetch], [], [], [], [], [], [], [], [], [], [], []的错误;
oracle官方说:
在这里插入图片描述

第三方工具(如PL/SQL Developer或Toad for Oracle -)进行选择使用Oracle数据库网关(如Dg4ODBC, DG4MSQL),会收到该错误消息
在使用Oracle软件时也会发生这个问题。网关版本从11.1到12.1都可能发生这种情况。

2.乱码问题,通过oracle网关查询mysql的表,时间类型字段会乱码

3.null和空值’‘问题
mysql中字段not null可以存入空值’‘, 空值(’')的长度是0,是不占用空间的;而的NULL长度是NULL,其实它是占用空间的。
而oracle中认为null和‘’(空字符串)是一个意思,‘’ (空串)默认被转换成了 NULL
就会出现ORA-01400: 无法将 NULL 插入 (%s)的报错信息

4.权限问题
出现以下报错
Error: ORA-04052: 在查找远程对象 root.audit_action@BEEHUB 时出错
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-28500: 连接 ORACLE 到非 Oracle 系统时返回此信息:
[MySQL][ODBC 8.0(w) Driver][mysqld-8.0.20]Unknown database ‘root’ {HY000,Nat

5.建表遇到Row size too large (> 8126) 错误

要建的表有几百个字段,很多char类型,建表报错
Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
根据提示,将一部分字段修改成改成text类型,仍然报上面错误

表的引擎从InnoDB换成MyISAM可以解决上面报错
– auto-generated definition

create table p_patent_txt
(
    id                           varchar(32) not null
        primary key                        ,
    DN                    text          null      comment '文献号'        ,
    KC                    text          null      comment '公开类型'       ,
    PAT                   text          null      comment '专利类型'         ,
    AN                    text          null      comment '申请号'       ,
    ANS                   text          null      comment '申请号统计'         
)engine=MyISAM;

信息拓展:
MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。
1)InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。
2)MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用
3)InnoDB支持外键,MyISAM不支持
4)从MySQL5.5.5以后,InnoDB是默认引擎
5)InnoDB不支持FULLTEXT类型的索引
6)InnoDB中不保存表的行数,如select count() from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含where条件时MyISAM也需要扫描整个表
7)对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引
8)清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表
9)InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like ‘%lee%’。

—未完待续

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值