MySQL中LENGTH()返回字节数而非字符数utf8mb4下汉字占3-4字节需用CHAR_LENGTH()按字符过滤PostgreSQL中LENGTH()按字符计OCTET_LENGTH()才按字节SQL Server用LEN()和DATALENGTH()区分字符与字节。MySQL里用LENGTH()查超长文本注意字符集陷阱MySQL的LENGTH()返回的是字节数不是字符数。如果你的字段是utf8mb4比如存emoji或中文一个汉字可能占3或4个字节直接拿LENGTH(content) 100当“超过100个字符”用结果会偏少——实际内容可能才60个汉字就触发了。确认字段字符集SHOW CREATE TABLE your_table; 看content列的CHARSET和COLLATION想按字符数过滤改用CHAR_LENGTH()更安全它统计的是Unicode字符个数如果必须用LENGTH()比如做存储空间估算得先知道最大单字符字节数utf8mb4下最多4字节所以“字符数≥100”的等价条件是LENGTH(content) 400PostgreSQL中LENGTH()行为不同别套用MySQL经验PostgreSQL的LENGTH()默认按字符计数和MySQL的LENGTH()语义相反但和MySQL的CHAR_LENGTH()一致。直接迁移SQL时容易翻车。PostgreSQL里LENGTH(content) 100就是“字符数超过100”没问题如果要按字节查比如排查BLOB混入得用OCTET_LENGTH(content)注意空格和不可见字符LENGTH(a || E || b)在PG里返回3含制表符若业务上想忽略首尾空白先TRIM()再算WHERE子句里用LENGTH()可能拖慢查询小心索引失效对字段套函数后绝大多数数据库无法走索引。哪怕content上有索引WHERE LENGTH(content) 500也会触发全表扫描。高频查询超长文本考虑加生成列索引MySQL 5.7ALTER TABLE t ADD COLUMN content_len INT AS (CHAR_LENGTH(content)) STORED;再给content_len建索引PostgreSQL可用函数索引CREATE INDEX idx_content_len ON t ((LENGTH(content))); 临时排查可以线上查询量大时避免裸用LENGTH()在WHERE里SQL Server用LEN()和DATALENGTH()区分更明显SQL Server不叫LENGTH()LEN()去尾空格后计字符数DATALENGTH()返回字节数——两者差值可能很大尤其遇到nvarcharUnicode每字符2字节。LEN(N你好)返回2DATALENGTH(N你好)返回4查“实际存储超过1KB的文本”必须用DATALENGTH(content) 1024用LEN()会错判LEN()对varchar和nvarchar都适用但结果含义不同前者是字节数近似值ASCII下字符数后者才是真实字符数实际写的时候得先看库型、再看字段类型、最后想清楚你要的是“人眼看到的长度”还是“磁盘占多少字节”。这两个目标在多字节字符集下根本不是一回事。