我在想我应该用什么样的排序规则来处理简单的问题 user 只包含两列的表, email 以及 password ,其中 password 将是 password_hash($str, PASSWORD_DEFAULT) .密码散列所需的最轻加权排序规则是什么?它是 ascii_bin ? latin1_bin ?
user
email
password
password_hash($str, PASSWORD_DEFAULT)
ascii_bin
latin1_bin
okxuctiv1#
排序规则性能。。。 ..._bin 有最少的事情要做,所以他们是最快的。 ascii_... 检查是否只使用7位;太快了。 ..._general_ci 只检查字节,不检查字节的组合。例如:德语 ß <>“ss”,与大多数其他排序规则不同。 utf8_... 以及 utf8mb4_... 检查字节是否有有效编码。同时,mysql 8.0也使得 utf8mb4_... 排序比5.7“快几个数量级”。但我通常发现,在mysql的任何操作中,其他考虑因素都更为重要。另一个例子。。。 SELECT ... function(foo) ... --相对于获取行的成本,评估函数的成本通常是微不足道的。因此,我将重点介绍如何优化获取行。至于散列。。。这取决于函数返回的是十六进制字符串还是一堆字节。。。十六进制:使用 CHARACTER SET ascii COLLATION ascii_bin (or ascii_ci) 这个 ...ci 会做箱子折叠,从而更宽容;这可能是这个案子的“正确”排序。字节:使用数据类型 BINARY ; 大致相当于 CHAR CHARACTER SET binary .至于是否使用 BINARY 与 VARBINARY 或者 CHAR 与 VARCHAR ,应该由函数是否返回固定长度的结果来控制。例如: MD5('asdfb') --> '23c42e11237c24b5b4e01513916dab4a' 正好返回32个十六进制字节,所以 CHAR(32) COLLATION ascii_ci 是“最好的”。但是,您可以通过使用 BINARY(16) (无排序)并将 UNHEX(MD5('asdfb')) 我喜欢它。 UUID() --> '161b6a10-e17f-11e8-bcc6-80fa5b3669ce' ,它有一些破折号要处理。否则,就是这样 CHAR(36) 或者 BINARY(16) .
..._bin
ascii_...
..._general_ci
ß
utf8_...
utf8mb4_...
SELECT ... function(foo) ...
CHARACTER SET ascii COLLATION ascii_bin (or ascii_ci)
...ci
BINARY
CHAR CHARACTER SET binary
VARBINARY
CHAR
VARCHAR
MD5('asdfb') --> '23c42e11237c24b5b4e01513916dab4a'
CHAR(32) COLLATION ascii_ci
BINARY(16)
UNHEX(MD5('asdfb'))
UUID() --> '161b6a10-e17f-11e8-bcc6-80fa5b3669ce'
CHAR(36)
1条答案
按热度按时间okxuctiv1#
排序规则性能。。。
..._bin
有最少的事情要做,所以他们是最快的。ascii_...
检查是否只使用7位;太快了。..._general_ci
只检查字节,不检查字节的组合。例如:德语ß
<>“ss”,与大多数其他排序规则不同。utf8_...
以及utf8mb4_...
检查字节是否有有效编码。同时,mysql 8.0也使得
utf8mb4_...
排序比5.7“快几个数量级”。但我通常发现,在mysql的任何操作中,其他考虑因素都更为重要。
另一个例子。。。
SELECT ... function(foo) ...
--相对于获取行的成本,评估函数的成本通常是微不足道的。因此,我将重点介绍如何优化获取行。至于散列。。。这取决于函数返回的是十六进制字符串还是一堆字节。。。
十六进制:使用
CHARACTER SET ascii COLLATION ascii_bin (or ascii_ci)
这个...ci
会做箱子折叠,从而更宽容;这可能是这个案子的“正确”排序。字节:使用数据类型
BINARY
; 大致相当于CHAR CHARACTER SET binary
.至于是否使用
BINARY
与VARBINARY
或者CHAR
与VARCHAR
,应该由函数是否返回固定长度的结果来控制。例如:MD5('asdfb') --> '23c42e11237c24b5b4e01513916dab4a'
正好返回32个十六进制字节,所以CHAR(32) COLLATION ascii_ci
是“最好的”。但是,您可以通过使用
BINARY(16)
(无排序)并将UNHEX(MD5('asdfb'))
我喜欢它。UUID() --> '161b6a10-e17f-11e8-bcc6-80fa5b3669ce'
,它有一些破折号要处理。否则,就是这样CHAR(36)
或者BINARY(16)
.