#java #android #sqlite #string-length
#java #Android #sqlite #android-sqlite #длина строки
Вопрос:
Укажите те же строковые данные
- SQLite выполняет
length
вычисления для своегоTEXT
столбца. 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, но это: … читая ваш ответ, нет, мой ответ не добавляет ничего нового … противоречит этому: может быть, кому-то пригодится мой простой пример в будущем