Tôi đã quản lý để thực hiện chuyển đổi. Điều khó khăn là nó không chỉ là một chuyển đổi cơ sở hỗn hợp, cơ sở cao hơn của ký tự đầu tiên cũng ảnh hưởng đến giá trị của các mã dài hơn.
Tôi bắt đầu với một trường hợp dễ dàng hơn; mã cơ số 10. Tôi thấy rằng phạm vi hai chữ số có 10 mã phụ, phạm vi ba chữ số có 100 mã phụ, v.v.:
0 - 9 : '0' - '9'
10 - 109 : '00' - '99'
110 - 1109 : '000' - '999'
1110 - 11109 : '0000' - '9999'
Vì vậy, giá trị của ký tự đầu tiên trong mã không chỉ là cơ sở được nâng lên vị trí, mà nó còn có một phần bù.
Sau khi áp dụng điều này cho mã hóa base-62, đây là kết quả của tôi:
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