Для той же строки, будет ли длина SQLite когда-либо возвращать значение, отличное от метода длины Java?

#java #android #sqlite #string-length

#java #Android #sqlite #android-sqlite #длина строки

Вопрос:

Укажите те же строковые данные

  1. SQLite выполняет length вычисления для своего TEXT столбца.
  2. TEXT Столбец считывается (с использованием базы данных Android Room) в строку Java, затем Java выполняет String.length()

Есть ли вероятность, что это даст 2 разных значения?

Я провел грубый тест, используя английские и неанглийские символы. Оба дают одинаковое значение.

Но я не уверен, есть ли какие-либо крайние случаи, которые я пропустил?

Ответ №1:

Поскольку вы ищете крайние случаи…

Из встроенных скалярных функций SQL SQLite:

длина (X)
Для строкового значения X
функция length (X) возвращает количество символов (не байтов) в X
до первого символа NUL . (выделение мое)
Поскольку строки SQLite обычно не содержат нулевых символов,
функция length(X) обычно возвращает общее количество символов в строке X….

Итак, SQLite, для:

 SELECT LENGTH('a' || CHAR(0) || 'b')
  

вернет 1 ,

но Java, для:

 String s = "a"   Character.toString('0')   "b";
System.out.println(""   s.length());
  

вернется 3 .

Комментарии:

1. Спасибо за информацию. Я заметил, что SUBSTR будет иметь тот же побочный эффект SELECT substr('abc' || CHAR(0) || 'def', 1, 5); . Похоже, мне нужно снова переосмыслить… Спасибо за пример.

Ответ №2:

В некоторых случаях длина может отличаться, Java использует UTF-16 для внутреннего строкового представления, поэтому некоторым символам потребуется суррогатная пара для сохранения в памяти. Строка Java.length() не учитывает это.

Простой пример с использованием символа 💩 emoji

     class HelloWorld {
    public static void main(String[] args) {
        System.out.println("💩".length());
    }}
  

Это выведет 2.

С другой стороны, в документации sqlite указано:

Для строкового значения X функция length(X) возвращает количество символов (не байтов) в X до первого символа NUL .

Он указывает, что он подсчитывает символы

 sqlite> select length('💩'); 
  

это вернет 1.

Это не относится исключительно к «смайликам», это будет то же самое и для некоторых языков, в которых есть символы с «высокими» кодовыми точками, такие как некоторые азиатские символы

протестировано с sqlite 3.28.0 и openjdk версии «1.8.0_252». Я думаю, что это должно быть верно для вашего стека.

Комментарии:

1. Поскольку упомянутый случай будет более вероятным, чем у forpas, я присужду вам баллы. Спасибо.

Ответ №3:

Соответствие документации символов Sqlite NUL (ASCII 0x00, Unicode u0000) в ТЕКСТОВОМ поле может привести к разным length значениям.

Например, текст Hello u0000World

Sqlite вернет длину 16

Java вернет длину 11

Java будет считать NUL символ как 1, а Sqlite будет считать 6. Один и тот же текст будет иметь разные значения.

Комментарии:

1. Есть ли в вашем ответе что-нибудь, что еще не было упомянуто в моем ответе, который был опубликован 2 дня назад?

2. Это самая странная вещь, которую я видел на SO, на момент написания ответа я не видел НИКАКОГО ответа на этот пост, у OP был 1 upvote и любой ответ. @forpas Итак, читая ваш ответ, нет, мой ответ не добавляет ничего нового.

3. мой ответ не добавляет ничего нового , так есть ли какая-либо причина сохранить его там?

4. Я потратил время на исследование и написание ответа, может быть, кому-то пригодится мой простой пример в будущем, я не думаю, что я перекрываю ваш ответ и в любом случае скопировал его, поэтому я оставлю ответ. В любом случае, если вы считаете, что мой ответ нарушает какое-то правило StackOverflow, вы можете отметить мой ответ, и кто-нибудь его рассмотрит. С уважением, @forpas

5. Я не знаю, нарушает ли ваш ответ правило ant SO, но это: … читая ваш ответ, нет, мой ответ не добавляет ничего нового … противоречит этому: может быть, кому-то пригодится мой простой пример в будущем