Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当JSON对象作为字符串文本插入时,MySQL JSON列将丢失十进制精度_Java_Mysql_Json_Jdbc - Fatal编程技术网

Java 当JSON对象作为字符串文本插入时,MySQL JSON列将丢失十进制精度

Java 当JSON对象作为字符串文本插入时,MySQL JSON列将丢失十进制精度,java,mysql,json,jdbc,Java,Mysql,Json,Jdbc,我试图将一个JSON文档插入到MySQL JSON列中,并注意到该列中的十进制精度丢失 {"value": 212765.700000000010000} 沦为 {"value": 212765.7} 我尝试过通过MySQL Workbench直接插入,我注意到不同的行为取决于我的方式。例如: insert into json_test values ('{"value": 212765.700000000010000}'); 产生相同的结果。。然而,以下工作: insert into j

我试图将一个JSON文档插入到MySQL JSON列中,并注意到该列中的十进制精度丢失

{"value": 212765.700000000010000}
沦为

{"value": 212765.7}
我尝试过通过MySQL Workbench直接插入,我注意到不同的行为取决于我的方式。例如:

insert into json_test values ('{"value": 212765.700000000010000}');
产生相同的结果。。然而,以下工作:

insert into json_test values (json_object('value', 212765.700000000010000));
我可以通过JSON函数调用动态生成insert语句来构建JSON对象,该函数调用适用于单个insert。。但是我使用的是JDBC批量更新,它要求SQL具有一致数量的参数(我们的JSON文档在结构上有所不同,因此这不起作用),或者在不使用绑定参数的情况下显式设置值,这显然是一种安全风险


有没有办法解决这个问题?

正如在问题的注释中所指出的,这似乎是MySQL解析包含非整数值的JSON文本的方式的问题,对于这些非整数值,DOUBLE不是最好的数据类型。如果希望将JSON作为字符串文字提供以加快批插入过程,那么一种可能的解决方法是将数值作为JSON字符串插入,然后在批插入完成后更新行:

mysql>选择版本();
+-------------------------+
|版本(|
+-------------------------+
|5.7.20-0ubuntu0.16.04.1|
+-------------------------+
一行一组(0.01秒)
mysql>创建表json_test(id INT主键,jv json);
查询正常,0行受影响(0.20秒)
将数值作为字符串插入

mysql>插入json_测试(id,jv)值(1,“{”值“:“212765.7000000010000”);
查询正常,1行受影响(0.11秒)
mysql>插入json_测试(id,jv)值(2,{“whatever”:“foo”});
查询正常,1行受影响(0.06秒)
mysql>插入json_测试(id,jv)值(3,“{”值“:“212765.7000000010000”,“任意“:“bar”}”);
查询正常,1行受影响(0.01秒)
mysql>从json_测试中选择*;
+----+--------------------------------------------------------+
|id | jv|
+----+--------------------------------------------------------+
|1{“值”:“212765.7000000010000”}|
|2{“随便”:“foo”}|
|3 |{“值”:“212765.7000000010000”,“任意”:“bar”}|
+----+--------------------------------------------------------+
一组3行(0.01秒)
。。。然后更新行以将值转换为十进制:

mysql>更新json_测试集jv=json_替换(jv,'$.value',CAST(json_提取(jv,'$.value')为十进制(21,15)),其中json_类型(json_提取(jv,'$.value'))='STRING';
查询正常,2行受影响(0.04秒)
匹配的行:2个已更改:2个警告:0
mysql>从json_测试中选择*;
+----+------------------------------------------------------+
|id | jv|
+----+------------------------------------------------------+
|1{“值”:212765.7000000010000}|
|2{“随便”:“foo”}|
|3 |{“值”:212765.7000000010000,“任意”:“bar”}|
+----+------------------------------------------------------+
一组3行(0.01秒)
mysql>从JSON_测试中选择JSON_类型(JSON_EXTRACT(jv,'$.value'))作为jt,其中id=1;
+---------+
|jt|
+---------+
|十进制|
+---------+
一行一组(0.01秒)

能否使用{“value”:“212765.7000001000000”}存储json对象?这样做将强制将值存储为字符串,这意味着精度不会改变。我们已经考虑过这一点,但理想情况下这是我们的最后手段。希望有人找到更好的解决方法。你知道吗,我认为这是预期的行为,因为他们说MySQL将数字存储为整数和双精度,然后尝试将
212765.7000000010000
存储在双精度变量中(我用java测试过),然后打印,结果将与MySQL相同,它认为这是一个双精度问题,不要问我为什么json_对象可以工作。你可能知道,如果创建一个双精度列而不指定精度,那么MySQL将进行舍入,就像在JSONI think中使用双变量的情况一样