Eu não me incomodaria com a probabilidade de colisão. Basta gerar uma string aleatória e verificar se ela existe. Se isso acontecer, tente novamente e você não precisará fazer isso mais do que algumas vezes, a menos que tenha um grande número de placas já atribuídas.
Outra solução para gerar uma string pseudo-aleatória de 8 caracteres em puro (My)SQL:
SELECT LEFT(UUID(), 8);
Você pode tentar o seguinte (pseudo-código):
DO
SELECT LEFT(UUID(), 8) INTO @plate;
INSERT INTO plates (@plate);
WHILE there_is_a_unique_constraint_violation
-- @plate is your newly assigned plate number
Como esta postagem recebeu um nível inesperado de atenção, deixe-me destacar Comentário do ADTC :o trecho de código acima é bastante burro e produz dígitos sequenciais.
Para uma aleatoriedade um pouco menos estúpida, tente algo assim:
SELECT LEFT(MD5(RAND()), 8)
E para aleatoriedade verdadeira (criptograficamente segura), use
RANDOM_BYTES()
em vez de RAND()
(mas então eu consideraria mover essa lógica para a camada de aplicação).