sql >> Databáze >  >> RDS >> Sqlserver

Vícebázová konverze - použití všech kombinací pro zkracovač URL

Podařilo se mi provést konverzi. Záludné je, že nejde jen o smíšenou základní konverzi, vyšší základ prvního znaku ovlivňuje i hodnoty delších kódů.

Začal jsem jednodušším případem; základní 10 kódy. Viděl jsem, že dvoumístný rozsah má 10 dalších kódů, třímístný rozsah má 100 dalších kódů a tak dále:

0 - 9        : '0' - '9'
10 - 109     : '00' - '99'
110 - 1109   : '000' - '999'
1110 - 11109 : '0000' - '9999'

Hodnota prvního znaku v kódu tedy není jen základna zvednutá na pozici, ale má také posun.

Po použití tohoto na kódování base-62 jsem skončil s tímto:

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



  1. Jak svázat proměnné SQL v PHP?

  2. Proč tato chyba migrace databáze po upgradu verze django-mptt?

  3. Tisk tabulky vodorovně namísto svislé pomocí PHP

  4. PDO načte jeden sloupec z tabulky do 1-rozměrného pole