mysql随机8位_sql - 使用MySQL生成随机且唯一的8个字符串

在开发车辆游戏时,需要为新车辆生成未使用的8字符随机车牌号。目前的方法是在Lua中生成字符串并查询数据库,但随着车辆增多效率降低。讨论了多种MySQL查询方法来生成并确保车牌号的唯一性,包括使用种子和循环、哈希函数、UUID以及自定义函数等解决方案。
摘要由CSDN通过智能技术生成

sql - 使用MySQL生成随机且唯一的8个字符串

我正在开发一款涉及车辆的游戏。 我有一个名为“车辆”的MySQL表,其中包含有关车辆的数据,包括存储车辆牌照的“板”栏。

现在这里出现了我遇到问题的部分。 我需要在创建新车辆之前找到未使用的车牌 - 它应该是一个字母数字8字符随机字符串。 我是如何实现这一点的是在Lua中使用while循环,这是我正在编程的语言,用于生成字符串并查询DB以查看它是否被使用。 然而,随着车辆数量的增加,我预计现在这种情况会变得更加低效。 因此,我决定尝试使用MySQL查询解决此问题。

我需要的查询应该只生成一个8字符的字母数字字符串,该字符串不在表中。 我再次想到了生成和检查循环方法,但我并没有将这个问题局限于那个以防万一更有效的问题。 我已经能够通过定义一个包含所有允许的字符的字符串并随机地对其进行子字符串来生成字符串,仅此而已。

任何帮助表示赞赏。

17个解决方案

68 votes

这个问题包含两个非常不同的子问题:

字符串必须看似随意

字符串必须是唯一的

虽然很容易实现随机性,但没有重试循环的唯一性则不然。 这使我们首先专注于独特性。 使用AUTO_INCREMENT可以轻松实现非随机唯一性。因此,使用唯一性保留,伪随机变换可能会很好:

@paul建议使用Hash

AES加密也适合

但有一个很好的:id本身!

保证由同一种子创建的一系列随机数

重复性

前8次迭代不同

如果种子是INT32

所以我们使用@ AndreyVolk或@ GordonLinoff的方法,但使用种子id:

例如 Assumin id是一个AUTO_INCREMENT col:

INSERT INTO vehicles VALUES (blah); -- leaving out the number plate

SELECT @lid:=LAST_INSERT_ID();

UPDATE vehicles SET numberplate=concat(

substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@lid)*4294967296))*36+1, 1),

substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),

substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),

substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),

substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),

substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),

substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),

substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed)*36+1, 1)

)

WHERE id=@lid;

Eugen Rieck answered 2019-06-12T07:24:15Z

67 votes

正如我在评论中所说,我不会为碰撞的可能性而烦恼。 只需生成一个随机字符串并检查它是

`LIKE` 和 `IN` 都是 MySQL 中的条件筛选语句,但是它们的使用场景和语法略有不同。 `LIKE` 用于匹配字符串,常用于模糊查询。语法为: ```SQL SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern; ``` 其中 `column_name` 是需要匹配的列名,`table_name` 是需要查询的表名,`pattern` 是需要匹配的字符串,可以使用 `%` 作为通配符。 例如,要查询 `employees` 表中名字中包含 `e` 的员工,可以使用以下 SQL 语句: ```SQL SELECT * FROM employees WHERE name LIKE '%e%'; ``` `IN` 用于匹配多个值,常用于多条件查询。语法为: ```SQL SELECT column_name(s) FROM table_name WHERE column_name IN (value1, value2, ...); ``` 其中 `column_name` 是需要匹配的列名,`table_name` 是需要查询的表名,`value1, value2, ...` 是需要匹配的值。 例如,要查询 `employees` 表中在 `New York` 和 `Los Angeles` 工作的员工,可以使用以下 SQL 语句: ```SQL SELECT * FROM employees WHERE city IN ('New York', 'Los Angeles'); ``` 当需要同时使用 `LIKE` 和 `IN` 时,可以使用以下 SQL 语句: ```SQL SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern AND column_name IN (value1, value2, ...); ``` 其中 `column_name` 是需要匹配的列名,`table_name` 是需要查询的表名,`pattern` 是需要匹配的字符串,`value1, value2, ...` 是需要匹配的值。 例如,要查询 `employees` 表中在 `New York` 和 `Los Angeles` 工作,并且名字中包含 `e` 的员工,可以使用以下 SQL 语句: ```SQL SELECT * FROM employees WHERE city IN ('New York', 'Los Angeles') AND name LIKE '%e%'; ``` 希望这些信息对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值