对于同一个字符串,SQLite的长度会返回与Java的长度方法不同的值吗?



给出相同的字符串数据

  1. SQLite对其TEXT列执行length计算
  2. TEXT列读取到(使用Android Room数据库)Java String中,然后Java执行String.length()

这些是否有可能产生两个不同的值?

我用英语和非英语字符做了一个粗略的测试。两者的价值相同。

但是,我不确定是否有我遗漏的边缘病例?

由于您正在寻找边缘案例

来自SQLite的内置标量SQL函数:

length(X)
对于字符串值X,
length(X)函数返回X中第一个NUL字符之前的字符数(而非字节数)。(emphasis mine)
由于SQLite字符串通常不包含NUL字符,
length(X)函数通常会返回字符串X中的字符总数。…

因此,SQLite,用于:

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

将返回1

但Java,用于:

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

将返回CCD_ 6。

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

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

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";。我认为这对你来说应该是正确的。

根据TEXT字段中SqliteNUL字符(ASCII 0x00,Unicode\u0000)的文档,可能会导致不同的length值。

以文本Hello\u0000World为例

Sqlite将返回长度为16的

Java将返回长度为11的

Java将NUL字符计数为1,而Sqlite将计数为6。相同的文本将具有不同的值。

最新更新