您知道值(例如12.21)总是适合DECIMAL(15,2)吗?
如果是这样,我看不出问题出在哪里。
AES_ENCRYPT(12.21, UNHEX('6E6F727468656173744032303134')) 会产生一些乱码。将其存储到合适大小的BLOB 或VARBINARY(..) 中。那么
SELECT AES_DECRYPT(the_blob, UNHEX('6E6F727468656173744032303134'))
将生成字符串12.21。如果您将INSERT 那个字符串转换成DECIMAL(15,2),它应该可以正常工作。
如果你存储到DECIMAL(65),它会去掉小数部分并给你一个12的值(这与12.21不同)。
如果您存储到DECIMAL(15,6),数字将相同(除了四个尾随零)。但请注意,小数点前只有 9 位的空间。等等。
测试用例:
mysql> SELECT AES_DECRYPT(AES_ENCRYPT(12.21,
UNHEX('6E6F727468656173744032303134')),
UNHEX('6E6F727468656173744032303134'));
+---------------------------------------------------------------------------------------------------------------+
| AES_DECRYPT(AES_ENCRYPT(12.21, UNHEX('6E6F727468656173744032303134')), UNHEX('6E6F727468656173744032303134')) |
+---------------------------------------------------------------------------------------------------------------+
| 12.21 |
+---------------------------------------------------------------------------------------------------------------+
注意加密后的值是 16 字节的倍数:
mysql> SELECT LENGTH(AES_ENCRYPT(12.21, UNHEX('6E6F727468656173744032303134')));+-------------------------------------------------------------------+
| LENGTH(AES_ENCRYPT(12.21, UNHEX('6E6F727468656173744032303134'))) |
+-------------------------------------------------------------------+
| 16 |
+-------------------------------------------------------------------+
+----------------------------------------------------------------------------------+
| LENGTH(AES_ENCRYPT(1234567890.123456789, UNHEX('6E6F727468656173744032303134'))) |
+----------------------------------------------------------------------------------+
| 32 |
+----------------------------------------------------------------------------------+