当前位置: 首页 > 科技观察

MySQL转Oracle遇到的问题:表名长度和大小写

时间:2023-03-12 11:17:32 科技观察

最近在做一个项目,需要把项目从MySql转成Oracle数据库,所以出这篇文章。记录下来以备后用。首先是将整个MySql数据库迁移到Oracle。方法比较简单。使用Navicat的数据传输功能,可以轻松搞定。只有一个需要注意的地方(我只遇到过一个),就是Oracle限制表名的长度最大为30字节,也就是说字母+数字+字符的总长度为30字节。如果有些表名超过30字节,需要重命名。字段名好像有这个限制,不过我没遇到过。如果遇到Arrived,那么就做同样的归约。同时,代码中实体和字段名的对应关系也要改变。其次是Oracle的另一个局限,资本化的问题。相信很多同事和我一样,习惯了MySql数据库表名和字段名的小写,所以在数据库迁移过程中大小写不会改变,但是在Oracle中,如果表名和字段名小写的时候都是定义好的,那么在操作SQL的时候,表名和字段名需要用引号括起来,但是之前项目中的SQL从来没有这样写过,那怎么办,是不是要改代码呢?我想大多数人都会选择换数据库来解决这个问题——把数据库中的表名和字段名改成大写就可以解决这个问题。手动改了两张表后,看了看剩下的155张表,陷入了沉思:不可能,世界上最懒的人就是程序员,程序员不可能这么改的,赶紧找个好伙伴来搜索引擎。果然无双路。我找了几个存储过程完美解决了这个问题:把指定表的所有字段都改成大写(把“表名”换成要修改的表名即可)。beginforcin(selectCOLUMN_NAMEcnfromall_tab_columnswheretable_name='tablename')loopbeginexecuteimmediate'altertabletablenamerenamecolumn"'||c.cn||'"to'||c.cn;其他人则异常dbms_output.put_line('表名'||'.'||c.cn||'已存在');结尾;结束循环;结尾;批量修改表名为大写。beginforcin(selecttable_nametnfromuser_tableswheretable_name<>upper(table_name))loopbeginexecuteimmediate'altertable"'||c.tn||'"重命名为'||c.tn;当其他人然后dbms_output.put_line(c.tn||'exists')时出现异常;结尾;结束循环;结尾;将空间内所有表的所有字段名批量修改为大写。beginfortin(selecttable_nametnfromuser_tables)loopbeginforcin(selectcolumn_namecnfromuser_tab_columnswheretable_name=t.tn)loopbeginexecuteimmediate'altertable"'||t.tn||'"重命名列"'||c.cn||'”到'||c.cn;其他人则异常dbms_output.put_line(t.tn||'.'||c.cn||'alreadyexists');结尾;结束循环;结尾;结束循环;结尾;将用户空间中的所有表名和所有字段更改为大写。beginfortin(selecttable_nametnfromuser_tableswheretable_name<>upper(table_name))loopbeginforcin(selectcolumn_namecnfromuser_tab_columnswheretable_name=t.tn)loopbeginexecuteimmediate'altertable"'||t.tn||'"重命名列"'||c.cn||'"为'||c.cn;其他人则异常dbms_output.put_line(t.tn||'.'||c.cn||'alreadyexists');结尾;结束循环;立即执行'altertable"'||t.tn||'"重命名为'||t.tn;当其他人然后dbms_output.put_line(t.tn||'hasExist')时出现异常;结尾;结束循环;结尾;我相信这些存储过程足以解决大部分问题。