给出相同的字符串数据
- SQLite对其
TEXT
列执行length
计算 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。相同的文本将具有不同的值。