Aria:DECIMAL 条目的长度不正确
Aria: Length of DECIMAL entries incorrect
我对 ARIA 数据库 table 的条目有疑问。表示table的结构应该是这样的:
SHOW CREATE TABLE grid;
CREATE TABLE `grid`
(`meas_time` decimal(11,1) unsigned NOT NULL,
`meas_id` tinyint(2) unsigned NOT NULL,
`frequency` float(6,4) unsigned NOT NULL,
`voltage` float(7,4) unsigned NOT NULL,
`phase` float(9,8) unsigned NOT NULL,
PRIMARY KEY (`meas_time`,`meas_id`))
ENGINE=Aria
DEFAULT CHARSET=latin1
PAGE_CHECKSUM=1
插入到此 table 中的数据始终具有相同的格式,应该完全符合上述结构。但是,这似乎只适用于 'meas_id'、'frequency'、'voltage' 和 'phase' - 而不适用于 'meas_time':
SELECT FROM grid PROCEDURE ANALYSE();
前(左)半答案table:
Field_name Min_value Max_value Min_length Max_length
archiv.grid.meas_time 1473152369.8 1475751654.0 22 22
archiv.grid.meas_id 1 1 1 1
archiv.grid.frequency 49.5832 59.9998 7 7
archiv.grid.voltage 101.3357 812.5874 8 8
archiv.grid.phase 0.00043659 6.99986124 10 10
答案的第二(右)一半table:
Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
0 0 1474509648.88213 845302.17909 DECIMAL(21, 1) NOT NULL
0 0 1.0000 0.0000 ENUM('1') NOT NULL
0 0 50.0250 0.3668 FLOAT(6,4) NOT NULL
0 0 289.5351 40.3620 FLOAT(7,4) NOT NULL
0 0 3.15090137 1.80843320 FLOAT(9,8) NOT NULL
所有数据都以相同的方式插入 - 通过使用 mySQLdb 包的 python 脚本。它专门将正确长度的字符串插入数据库,例如:
command = "INSERT INTO grid VALUES ('" + str(timestamp)[:12] + \
"', '" + str(frequency)[:7] + "', '" + str(voltage)[:8] + \
"', '" + str(phase)[:10] + "');"
self.localCursor.execute(command)
self.localDB.commit()
我运行的数据库管理系统如下:
Server Version: 5.5.52-MariaDB-1ubuntu0.14.04.1 - (Ubuntu)
显然,这种差异是一个问题,因为它不必要地增加了我的数据库的大小。有谁知道,为什么会这样,我该如何阻止它?
用于存储十进制列的内部格式已更改(afaik 在 MySQL 5.0 或 5.1 中)并且更改未在过程分析()中更新。所以忽略这些值。
如果您的 where 条件使用 maes_id.
,您应该明确考虑更改主键中的键顺序以避免索引扫描
不使用FLOAT(m,n)
;它会导致双舍入和潜在的数据损坏。要么使用普通的 FLOAT
(像这样的科学数量),要么使用 DECIMAL(m,n)
(为了钱)。
PROCEDURE ANALYSE
已弃用。确实有一些用处,但那太糟糕了。
ANALYSE
可能会做 DOUBLE
中的所有事情。不管怎样,你想要这三个 整数 的平均值:1
和 2
和 1
? 1.3333333
是显而易见的答案,但是谁来控制小数位数呢?不就是 'wrong' 舍入到原始数据类型得到 1
吗?
我对 ARIA 数据库 table 的条目有疑问。表示table的结构应该是这样的:
SHOW CREATE TABLE grid;
CREATE TABLE `grid`
(`meas_time` decimal(11,1) unsigned NOT NULL,
`meas_id` tinyint(2) unsigned NOT NULL,
`frequency` float(6,4) unsigned NOT NULL,
`voltage` float(7,4) unsigned NOT NULL,
`phase` float(9,8) unsigned NOT NULL,
PRIMARY KEY (`meas_time`,`meas_id`))
ENGINE=Aria
DEFAULT CHARSET=latin1
PAGE_CHECKSUM=1
插入到此 table 中的数据始终具有相同的格式,应该完全符合上述结构。但是,这似乎只适用于 'meas_id'、'frequency'、'voltage' 和 'phase' - 而不适用于 'meas_time':
SELECT FROM grid PROCEDURE ANALYSE();
前(左)半答案table:
Field_name Min_value Max_value Min_length Max_length
archiv.grid.meas_time 1473152369.8 1475751654.0 22 22
archiv.grid.meas_id 1 1 1 1
archiv.grid.frequency 49.5832 59.9998 7 7
archiv.grid.voltage 101.3357 812.5874 8 8
archiv.grid.phase 0.00043659 6.99986124 10 10
答案的第二(右)一半table:
Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
0 0 1474509648.88213 845302.17909 DECIMAL(21, 1) NOT NULL
0 0 1.0000 0.0000 ENUM('1') NOT NULL
0 0 50.0250 0.3668 FLOAT(6,4) NOT NULL
0 0 289.5351 40.3620 FLOAT(7,4) NOT NULL
0 0 3.15090137 1.80843320 FLOAT(9,8) NOT NULL
所有数据都以相同的方式插入 - 通过使用 mySQLdb 包的 python 脚本。它专门将正确长度的字符串插入数据库,例如:
command = "INSERT INTO grid VALUES ('" + str(timestamp)[:12] + \
"', '" + str(frequency)[:7] + "', '" + str(voltage)[:8] + \
"', '" + str(phase)[:10] + "');"
self.localCursor.execute(command)
self.localDB.commit()
我运行的数据库管理系统如下:
Server Version: 5.5.52-MariaDB-1ubuntu0.14.04.1 - (Ubuntu)
显然,这种差异是一个问题,因为它不必要地增加了我的数据库的大小。有谁知道,为什么会这样,我该如何阻止它?
用于存储十进制列的内部格式已更改(afaik 在 MySQL 5.0 或 5.1 中)并且更改未在过程分析()中更新。所以忽略这些值。
如果您的 where 条件使用 maes_id.
,您应该明确考虑更改主键中的键顺序以避免索引扫描不使用FLOAT(m,n)
;它会导致双舍入和潜在的数据损坏。要么使用普通的 FLOAT
(像这样的科学数量),要么使用 DECIMAL(m,n)
(为了钱)。
PROCEDURE ANALYSE
已弃用。确实有一些用处,但那太糟糕了。
ANALYSE
可能会做 DOUBLE
中的所有事情。不管怎样,你想要这三个 整数 的平均值:1
和 2
和 1
? 1.3333333
是显而易见的答案,但是谁来控制小数位数呢?不就是 'wrong' 舍入到原始数据类型得到 1
吗?