J'ai réussi à faire la conversion. La difficulté est qu'il ne s'agit pas seulement d'une conversion de base mixte, la base supérieure du premier caractère affecte également les valeurs des codes plus longs.
J'ai commencé avec un cas plus facile; codes en base 10. J'ai vu que la plage à deux chiffres a 10 codes supplémentaires, la plage à trois chiffres a 100 codes supplémentaires, et ainsi de suite :
0 - 9 : '0' - '9'
10 - 109 : '00' - '99'
110 - 1109 : '000' - '999'
1110 - 11109 : '0000' - '9999'
Ainsi, la valeur du premier caractère du code n'est pas seulement la base élevée à la position, mais elle a également un décalage.
Après avoir appliqué ceci à l'encodage base-62, voici ce que j'ai obtenu :
create function tiny_Encode(@UrlId int) returns varchar(10)
as
begin
declare
@Chars varchar(62),
@Code varchar(10),
@Value int,
@Adder int
set @Chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
if (@UrlId < 63) begin
set @Code = substring(@Chars, @UrlId, 1)
end else begin
set @UrlId = @UrlId - 1
set @Value = 62
set @Adder = 0
while (@UrlId >= @Value * 63 + @Adder) begin
set @Adder = @Adder + @Value
set @Value = @Value * 62
end
set @Code = substring(@Chars, (@UrlId - @Adder) / @Value, 1)
set @UrlId = ((@UrlId - @Adder) % @Value)
while (@Value > 1) begin
set @Value = @Value / 62
set @Code = @Code + substring(@Chars, @UrlId / @Value + 1, 1)
set @UrlId = @UrlId % @Value
end
end
return @Code
end