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 中的所有事情。不管怎样,你想要这三个 整数 的平均值:1211.3333333 是显而易见的答案,但是谁来控制小数位数呢?不就是 'wrong' 舍入到原始数据类型得到 1 吗?