jsqlparser 에서 Unicode 사용하기
상황
jsqlparser 의 option 이 Unicode 입력이 불가하게 설정되어서 한글 입출력이 안 됨.
조치
src/main/javacc/JSqlParserCC.jj 를 열어서 다음 내용을 추가
beforeoptions{ IGNORE_CASE=true ; STATIC=false; // DEBUG_LOOKAHEAD= true ; // FORCE_LA_CHECK=true; // DEBUG_TOKEN_MANAGER=true; }
Afteroptions{ IGNORE_CASE=true ; STATIC=false; UNICODE_INPUT = true; // DEBUG_LOOKAHEAD= true ; // FORCE_LA_CHECK=true; // DEBUG_TOKEN_MANAGER=true; }
- javacc 로 compile 한다
- mvn javacc:javacc
- JavaCC 로 생성된 .java 파일은 target\generated-sources\javacc\net\sf\jsqlparser\parser 에 위치한다. src 에 복사한다.
- copy target\generated-sources\javacc\net\sf\jsqlparser\parser\*.java src\main\java\net\sf\jsqlparser\parser
- mvn clean package 로 UNICODE 지원하는 jsqlparser artifact를 생성한다.
기존 jsqlparser 를 대신해서 한글이 들어간 SQL 문이 이상없는지 확인해 본다.
utf8ParsingTest.javaimport java.io.StringReader; import net.sf.jsqlparser.parser.CCJSqlParser; import net.sf.jsqlparser.parser.ParseException; import org.junit.After; import org.junit.Before; import org.junit.Test; public class utf8ParsingTest { @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } @Test public void select() throws ParseException { String sql = "select * from tbl where col1 = '한글 테스트';"; StringReader statementReader=new StringReader(sql); CCJSqlParser parser = new CCJSqlParser(statementReader); parser.Statement(); } @Test public void jsql() throws ParseException { String sql = "insert into tbl (col1, col2) values('똠방각하', 2 );"; StringReader statementReader=new StringReader(sql); CCJSqlParser parser = new CCJSqlParser(statementReader); parser.Statement(); } }
빌드가 귀찮으면 첨부한 파일(jsqlparser-0.8.0-unicode.jar)을 기존 jsqlparser 를 대체해서 사용
Ref
- http://stackoverflow.com/questions/9500521/print-in-javacc
- http://stackoverflow.com/questions/11911748/non-english-tokens-in-javacc