对于相同的字符串,SQLite 的 length 会返回与 Java 的 length 方法不同的值吗?

Che*_*eng 5 java sqlite android string-length

给出相同的 String 数据

  1. SQLitelength对其TEXT列执行计算。
  2. TEXT列被读入(Using Android Room database)Java String,然后Java执行String.length()

这些有没有可能产生 2 个不同的值?

我使用英文和非英文字符做了一个粗略的测试。两者产生相同的值。

但是,我不确定我是否遗漏了任何边缘情况?

for*_*pas 7

由于您正在寻找边缘情况...

来自 SQLite 的内置标量 SQL 函数

length(X)
对于字符串值 X,
length(X) 函数返回 X
中第一个 NUL 字符之前的字符数(不是字节数)。(强调我的
由于 SQLite 字符串通常不包含 NUL 字符,
因此 length(X) 函数通常会返回字符串 X 中的字符总数....

所以,SQLite,对于:

SELECT LENGTH('a' || CHAR(0) || 'b')
Run Code Online (Sandbox Code Playgroud)

会回来1

但是 Java,对于:

String s = "a" + Character.toString('\0') + "b";
System.out.println("" + s.length());
Run Code Online (Sandbox Code Playgroud)

会回来3


dav*_*-ao 5

在某些情况下,长度可能不同,Java 使用 UTF-16 来表示内部字符串,因此某些类型的字符需要一个代理对来存储在内存中。Java 的 String.length() 没有考虑到这一点。

使用表情符号字符的简单示例

    class HelloWorld {
    public static void main(String[] args) {
        System.out.println("".length());
    }}
Run Code Online (Sandbox Code Playgroud)

这将打印 2。

另一方面,sqlite 的文档说明:

对于字符串值 X,length(X) 函数返回 X 中第一个 NUL 字符之前的字符数(不是字节数)。

它指定对字符进行计数

sqlite> select length(''); 
Run Code Online (Sandbox Code Playgroud)

这将返回 1。

这不是“表情符号”独有的,对于某些具有“高”代码点字符(如某些亚洲字符)的语言也是如此

使用 sqlite 3.28.0 和 openjdk 版本“1.8.0_252”进行测试。我认为它应该适用于您的堆栈。