前幾個星期, 搭建項目的單元測試配置, 打算使用H2作爲內存數據庫來跑單元測試, 可是項目使用的是MYSQL數據庫, Navicat導出的sql不兼容H2數據庫, 因此須要轉換. 通過了一些常識, 寫了個工具類類轉換.java
右鍵數據庫 -> Dump SQL File -> Structure Only
導出僅包含建表語句的SQL文件.import java.io.File; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.google.common.base.Charsets; import com.google.common.io.Files; /** * 轉換navicat導出的mysql的建表語句爲h2的語法 * * 主要的要注意的點是: * * 1.設置H2爲mysql模式, 能夠經過 SET MODE MYSQL;語句來實現 * * 2.'`'所有要去掉 * * 3.字段的字符集設置'COLLATE utf8_bin'不支持, 須要刪除, 如這樣的'`operator` varchar(10) COLLATE utf8_bin NOT NULL' * * 4.註釋按道理也沒問題的, 可是沒有用, 因此刪除了. * * 5.'ENGINE=InnoDB'設置不支持, 刪掉 * * 6.'DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'不支持, 修改成H2相似的'AS CURRENT_TIMESTAMP' * * 7.H2的索引名必需要全局惟一, 因此須要替換全部的索引名爲全局惟一 * * @author tudesheng * @since 2016年6月20日 下午8:37:52 * */ public class TransformMysqlToH2 { public static void main(String[] args) throws Exception { File file = new File("C:\\Users\\haogrgr\\Desktop\\你的sql文件"); String content = Files.toString(file, Charsets.UTF_8); content = "SET MODE MYSQL;\n\n" + content; content = content.replaceAll("`", ""); content = content.replaceAll("COLLATE.*(?=D)", ""); content = content.replaceAll("COMMENT.*'(?=,)", ""); content = content.replaceAll("\\).*ENGINE.*(?=;)", ")"); content = content.replaceAll("DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP", " AS CURRENT_TIMESTAMP"); content = uniqueKey(content); System.out.println(content); } /** * h2的索引名必須全局惟一 * * @param content sql建表腳本 * @return 替換索引名爲全局惟一 */ private static String uniqueKey(String content) { int inc = 0; Pattern pattern = Pattern.compile("(?<=KEY )(.*?)(?= \\()"); Matcher matcher = pattern.matcher(content); StringBuffer sb = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(sb, matcher.group() + inc++); } matcher.appendTail(sb); content = sb.toString(); return content; } }
代碼比較簡單, 註釋裏面有說明, 不必定能處理全部狀況, 可是我這裏是能夠了.mysql