Datajam已经描述的内容是正确的.这是一些进一步的解释.
如果你没有为ENCRYPT()函数提供salt,那么将生成一个随机的盐并用于加密字符串.salt只有两个字节/字符.
首先,我将证明,如果我ENCRYPT()使用相同的字符串运行两次,它将给出不同的值(因为随机盐不同)
mysql> SELECT ENCRYPT('hello');
+------------------+
| ENCRYPT('hello') |
+------------------+
| 5Q5CiJWj4GItY |
+------------------+
1 row in set (0.02 sec)
mysql> SELECT ENCRYPT('hello');
+------------------+
| ENCRYPT('hello') |
+------------------+
| 7QHPY3iSLVdas |
+------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
现在,如果我使用最后一个条目并尝试ENCRYPT()再次使用我们已经作为salt的值,我们将得到相同的结果:
mysql> SELECT ENCRYPT('hello', '7QHPY3iSLVdas');
+-----------------------------------+
| ENCRYPT('hello', '7QHPY3iSLVdas') |
+-----------------------------------+
| 7QHPY3iSLVdas |
+-----------------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
只是为了证明如果我们得到相同盐的字符串(密码)错误,我们将获得不同的值.请注意,在此示例中,两个第一个字符(只是盐)保持不变.
mysql> SELECT ENCRYPT('helloX', '7QHPY3iSLVdas');
+------------------------------------+
| ENCRYPT('helloX', '7QHPY3iSLVdas') |
+------------------------------------+
| 7QKDSis4DZnCU |
+------------------------------------+
1 row in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)
使用此信息,您应该尝试运行ENCRYPT()指定相同salt的两个MySQL服务器的功能,您应该获得相同的结果.如果没有,那么crypt()的实现可能在两者之间有所不同.