Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Najlepszy sposób na skrócenie ciągu UTF8 na podstawie długości bajtów

Oto dwa możliwe rozwiązania - jednowierszowy LINQ przetwarzający dane wejściowe od lewej do prawej i tradycyjny for -loop przetwarzanie danych wejściowych od prawej do lewej. Który kierunek przetwarzania jest szybszy, zależy od długości łańcucha, dozwolonej długości bajtów oraz liczby i rozmieszczenia znaków wielobajtowych i trudno jest podać ogólną sugestię. Decyzja między LINQ a tradycyjnym kodem to chyba kwestia gustu (a może szybkości).

Jeśli szybkość ma znaczenie, można by pomyśleć o gromadzeniu długości każdego znaku w bajtach aż do osiągnięcia maksymalnej długości, zamiast obliczania długości całego ciągu w bajtach w każdej iteracji. Ale nie jestem pewien, czy to zadziała, ponieważ nie znam wystarczająco dobrze kodowania UTF-8. Teoretycznie mógłbym sobie wyobrazić, że długość łańcucha w bajtach nie jest równa sumie długości wszystkich znaków w bajtach.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Eksportuj wyniki zapytania Oracle do pliku HTML podczas korzystania z SQLcl

  2. Dlaczego nazwy tabel/kolumn/indeksów Oracle są ograniczone do 30 znaków?

  3. Szybki sposób na generowanie połączonych ciągów w Oracle

  4. Błąd podczas drukowania zmiennej REFCURSOR jako parametru OUT w procedurze w Oracle 11g

  5. Obsługa błędów Oracle