sql >> Databasteknik >  >> RDS >> Oracle

Bästa sättet att förkorta UTF8-strängen baserat på bytelängd

Här är två möjliga lösningar - en LINQ one-liner som bearbetar inmatningen från vänster till höger och en traditionell for -loop bearbetar inmatningen från höger till vänster. Vilken bearbetningsriktning som är snabbare beror på stränglängden, den tillåtna bytelängden och antalet och fördelningen av multibytetecken och är svårt att ge ett generellt förslag. Beslutet mellan LINQ och traditionell kod är nog en fråga om smak (eller kanske hastighet).

Om hastigheten spelar roll kan man tänka på att bara ackumulera bytelängden för varje tecken tills den når den maximala längden istället för att beräkna bytelängden för hela strängen i varje iteration. Men jag är inte säker på om detta kommer att fungera eftersom jag inte kan UTF-8-kodning tillräckligt bra. Jag skulle teoretiskt kunna föreställa mig att bytelängden på en sträng inte är lika med summan av bytelängderna för alla tecken.

public static String LimitByteLength(String input, Int32 maxLength)
{
    return new String(input
        .TakeWhile((c, i) =>
            Encoding.UTF8.GetByteCount(input.Substring(0, i + 1)) <= maxLength)
        .ToArray());
}

public static String LimitByteLength2(String input, Int32 maxLength)
{
    for (Int32 i = input.Length - 1; i >= 0; i--)
    {
        if (Encoding.UTF8.GetByteCount(input.Substring(0, i + 1)) <= maxLength)
        {
            return input.Substring(0, i + 1);
        }
    }

    return String.Empty;
}


  1. Steg för steg uppgraderingsprocess till R12.2 Uppgraderingsdel -2 (Huvuduppgraderingsdrivrutin för R12.2.0)

  2. Konstigt beteende i Postgresql

  3. Hur man infogar om rad inte finns (UPSERT) i MySQL

  4. Varning:mysql_result() förväntar sig att parameter 1 är resurs, boolesk given