SQL 和 JDBC 中的数据类型映射

sql常规:  http://www.tutorialspoint.com/jdbc/jdbc-data-types.htm

                http://www.cnblogs.com/shishm/archive/2012/01/30/2332142.html

postgresql: http://postgresql.nabble.com/PostgreSQL-data-types-mapped-Java-classes-for-JDBC-td3205204.html#a3205425

postgresql中几个特殊数据类型:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=20726500&id=3853881

money的输入输出形式依赖于数据库的lc_monetary参数:

  1. postgres=# show lc_monetary;
                         lc_monetary
    -----------------------------------------------------
     Chinese (Simplified)_People's Republic of China.936
    (1 行记录)
    postgres=# select 1.1::money;
     money
    --------
     ¥1.10
    (1 行记录)
    postgres=# set lc_monetary='C';
    SET
    postgres=# select 1.1::money;
     money
    -------
     $1.10
    (1 行记录)

这里却有一个不同的地方,lc_monetary参数不仅仅影响了money的输入输出形式,还规定的money的语义(币种)。我们知道10美元和10人民币是不能划上等号的,而单独的money的存储格式里却不包含币种信息。所以money还不能算作真正的货币类型,这其实也限制了money在整个数据库里只能有一个统一的币种。
不仅如此,有些API在处理money时也犯了难,比如:pgjdbc将money映射为java的double,并假设货币为美元对服务端返回的money字符串进行解析。这导致对服务端的lc_monetary参数值为美元以外的货币时,pgjdbc将会解析失败(*1)。npgsql将money映射为.net的decimal类型,并在解析时假设货币的小数位数一定是2位。这样在那些不符合这一假设的货币上就悲剧了,比如100日圆通过npgsql读出来就成了1日圆(*2)。

鉴于以上种种,建议避开money的使用,改用decimal 或者 numeric。

*1)回避方法为使用ResultSet.getString()直接获取字符串避开解析过程。
*2)开发版的npgsql已经解决了这个问题,方法为在建立连接时强制将lc_monetary参数值设为C,即美元。
*)在8.2及之前版本的文档里,曾声明货币数据类型是将要被废弃的一种数据类型,不推荐使用。但8.3有对其进行了改进,存储大小也有4字节扩大到8字节。手册追加了一些使用上的说明,并删掉了“将要被废弃”的描述。



转载于:https://my.oschina.net/liuyuanyuangogo/blog/364235

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值