我对使用MONEY数据类型的JDBC应用程序有疑问。当我插入MONEY栏时:
insert into _money_test (amt) values ('123.45')
我有例外:
Character to numeric conversion error
在使用ODBC驱动程序的本机Windows应用程序中,也可以使用相同的SQL。我住在波兰,居住在波兰,在我的国家/地区用逗号分隔数字的小数部分,因此我尝试:
insert into _money_test (amt) values ('123,45')
而且有效。我检查了在PreparedStatement中必须使用点分隔符:123.45
。当然,我可以使用:
insert into _money_test (amt) values (123.45)
但是有些代码是“通用”代码,它从csv文件导入数据,并且可以安全地将数字放入字符串文字中。
如何强制JDBC在文字中使用DBMONEY(或简单地使用点)?
我的工作站是WinXP。我有3.50 TC5 / JC5版本的ODBC和JDBC Informix客户端。我已将DBMONEY设置为仅加点:
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')
当我用点和逗号运行金钱文字时的结果:
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]
我通过使用PreparedStatement解决了这个问题。我认为“字符到数字转换错误”是Informix JDBC驱动程序中的错误。
在我经常使用的其他数据库PostgreSQL中,如果我通过本机JDBC驱动程序或JDBC-
ODBC桥运行查询,则没有任何区别。我发现PostgreSQL不接受数字形式123.45
。PostgreSQL接受带点的字符串文字,但是这个点被当作千位分隔符来处理。唯一正确接受的值是字符串文字,其中逗号分隔小数部分。
编辑 :
可以通过DBMONEY=.
在服务器端进行设置来解决,然后所有连接(ODBC,JDBC)都可以使用该设置。
我已经设法使十六进制转换为十六进制,但您可以从输出中看到,当我尝试将Base64转换回十六进制时,有一个轻微的异常(例如,将Base64的最后四个值与十六进制输出进行比较)。 十六进制到基64: 应打印:SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t实际打印:SSDTIGTPBGXPBMCGEW91CIBICMFPB
问题内容: 我需要用点替换逗号,然后我需要将值设为数字。所以我这样写: 但是然后我想转换该值,然后出现错误: 问题答案: 该函数使用会话的NLS_NUMERIC_CHARACTERS设置来决定如何解释逗号和句点。如果您知道字符串始终以逗号作为小数点分隔符,则可以使用可选的第三个参数将其覆盖为调用的一部分;尽管这确实意味着您必须指定格式模型: 您不需要单独的步骤。 您也可以使用更改会话的设置,但可能
问题内容: 我想将十六进制字符串转换为二进制字符串。例如,十六进制2是0010。下面是代码: 但是,这仅适用于十六进制0-9;它不适用于十六进制A-F,因为它使用。谁能增强它? 问题答案: 您需要告诉Java int是十六进制的,如下所示:
我有一个CLinux设备,我需要转换一些数据。输入类似于 我需要 这是我尝试过的代码,但它不能编译,因为sstream不在设备操作系统上。有人能给我另一个转换数据的解决方案吗?
我有两个字符串的输入,每个字符串以十进制格式表示一个非负有理数。 给定这两个字符串,我想检查由x表示的数值是否大于由y表示的数值。 这两个值可以非常大,也可以扩展到非常高的精度(即小数点后的许多数字)。 因此,我不能依赖
我试图组成一个格式化的字符串,应该看起来像这样: 一瓶伏特加要x.yz卢布。 其中x.yz是四舍五入为2个小数点的任意双精度值。 为了实现这一点,我使用字符串插值和printf语法: 不幸的是,在一台使用俄语语言环境的机器上,上面的代码片段产生的结果与我想要实现的结果略有不同: str:String=一瓶伏特加要2.56卢布。 这是可以理解的(f interpolator使用的Java格式化程序应