문제

돈 데이터 유형을 사용하는 JDBC 애플리케이션에 문제가 있습니다. 돈 열에 삽입 할 때 :

insert into _money_test (amt) values ('123.45')

나는 예외를 얻었다 :

Character to numeric conversion error

동일한 SQL은 ODBC 드라이버를 사용하여 기본 Windows 응용 프로그램에서 작동합니다. 나는 폴란드에 살고 있으며 폴란드 로케일을 가지고 있으며, 우리나라에서 쉼표는 십진수의 수를 분리 시켜서 시도했습니다.

insert into _money_test (amt) values ('123,45')

그리고 그것은 효과가있었습니다. 준비된 상태에서 DOT 분리기를 사용해야하는지 확인했습니다. 123.45. 물론 사용할 수 있습니다.

insert into _money_test (amt) values (123.45)

그러나 일부 코드는 "일반"이며 CSV 파일에서 데이터를 가져 오며 숫자를 문자열 리터럴에 넣는 것이 안전했습니다.

JDBC가 리터럴에서 dbmoney (또는 단순히 점)를 사용하도록 강요하는 방법은 무엇입니까?

내 워크 스테이션은 WinXP입니다. 버전 3.50 TC5/JC5에 ODBC 및 JDBC Informix 클라이언트가 있습니다. 나는 dbmoney를 단지 dot로 설정했습니다.

DBMONEY=.

편집하다:

Jython의 테스트 코드 :

import sys
import traceback
from java.sql import DriverManager
from java.lang import Class

Class.forName("com.informix.jdbc.IfxDriver")

QUERY = "insert into _money_test (amt) values ('123.45')"

def test_money(driver, db_url, usr, passwd):
    try:
        print("\n\n%s\n--------------" % (driver))
        db = DriverManager.getConnection(db_url, usr, passwd)
        c = db.createStatement()
        c.execute("delete from _money_test")
        c.execute(QUERY)
        rs = c.executeQuery("select amt from _money_test")
        while (rs.next()):
            print('[%s]' % (rs.getString(1)))
        rs.close()
        c.close()
        db.close()
    except:
        print("there were errors!")
        s = traceback.format_exc()
        sys.stderr.write("%s\n" % (s))



print(QUERY)
test_money("com.informix.jdbc.IfxDriver", 'jdbc:informix-sqli://169.0.1.225:9088/test:informixserver=ol_225;DB_LOCALE=pl_PL.CP1250;CLIENT_LOCALE=pl_PL.CP1250;charSet=CP1250', 'informix', 'passwd')
test_money("sun.jdbc.odbc.JdbcOdbcDriver", 'jdbc:odbc:test', 'informix', 'passwd')

Dot과 Comma로 돈을 문자 그대로 실행할 때 결과 :

C:\db_examples>jython ifx_jdbc_money.py
insert into _money_test (amt) values ('123,45')


com.informix.jdbc.IfxDriver
--------------
[123.45]


sun.jdbc.odbc.JdbcOdbcDriver
--------------
there were errors!
Traceback (most recent call last):
    File "ifx_jdbc_money.py", line 16, in test_money
        c.execute(QUERY)
SQLException: java.sql.SQLException: [Informix][Informix ODBC Driver][Informix]Character to numeric conversion error


C:\db_examples>jython ifx_jdbc_money.py
insert into _money_test (amt) values ('123.45')


com.informix.jdbc.IfxDriver
--------------
there were errors!
Traceback (most recent call last):
    File "ifx_jdbc_money.py", line 16, in test_money
        c.execute(QUERY)
SQLException: java.sql.SQLException: Character to numeric conversion error



sun.jdbc.odbc.JdbcOdbcDriver
--------------
[123.45]
도움이 되었습니까?

해결책 2

준비된 상태를 사용 하여이 문제를 해결했습니다. "숫자 전환 오류"는 Informix JDBC 드라이버의 버그라고 생각합니다.

내가 자주 사용하는 다른 데이터베이스 인 PostgreSQL에서는 기본 JDBC 드라이버 또는 JDBC-ODBC 브리지를 통해 쿼리를 실행하는 경우 차이가 없습니다. PostgreSQL이 숫자 양식을 허용하지 않는다는 것을 알았습니다 123.45. PostgreSQL은 DOT로 문자열 문자를 허용하지만이 점은 천 명 분리기로 처리됩니다. 올바르게 허용되는 유일한 값은 쉼표가 십진수를 분리하는 문자열 리터럴입니다.

편집하다:

설정으로 해결할 수 있습니다 DBMONEY=. 서버 측에서는 모든 연결 (ODBC, JDBC)이 해당 설정에서 작동합니다.

다른 팁

그만큼 Informix JDBC 데이터 유형 매핑 문서 다음을 말합니다.

java.math.bigdecimal money (p, s) 1

따라서 사용해야합니다 java.math.BigDecimal 대신에 java.lang.String 값을 나타내려면 PreparedStatement#setBigDecimal() 값을 설정하고 ResultSet#getBigDecimal() 가치를 얻으려면.

"변환"할 수 있습니다 String 에게 BigDecimal 그냥 전달하여 건설자 논쟁. 다른 방법은 toString() 의 방법 BigDecimal.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top