刚接触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%’。
—未完待续