当我使用子字符串时,起点是 1,而不是零 (0)

Jac*_*uro 1 mysql sql substring

我使用 MYSQL,而不是 SQL 我有这个表,我想选择没有“M”的表 这是我创建的表

CREATE TABLE test (
  id VARCHAR(10)
);  
INSERT INTO test (id) VALUES ('M1');  
INSERT INTO test (id) VALUES ('M2');
.... 
INSERT INTO test (id) VALUES ('M128');  
INSERT INTO test (id) VALUES ('M129');
Run Code Online (Sandbox Code Playgroud)

我希望代码选择是这样的:

Select Substring(id,1) from test
Run Code Online (Sandbox Code Playgroud)

结果是从“M1”->“M129”但是当代码是这样的:

Select Substring(id,2) from test
Run Code Online (Sandbox Code Playgroud)

结果是从 1 -> 129 所以起点是 1,而不是 0
但是当我在 W3school 或一些网站上阅读时,它说起点是
0。Somone 能告诉我为什么吗?

Joe*_*orn 9

不确定你看到了什么,但MySql的W3Schools 文档显示了这一点:

注意
字符串中的第一个位置是 1

MySql 官方看起来是这样的:

要从中提取子串的字符串中第一个字符的位置被计算为 1。

以下是其他一些:

SQL Server 官方

start
是一个整数或 bigint 表达式,用于指定返回字符的开始位置。(编号从 1 开始,这意味着表达式中的第一个字符是 1)。

SQL Server W3Schools

start_pos       必需。开始提取的位置。字符串中的第一个位置是 1

甲骨文官方

当位置为 0(零)时,则将其视为 1。

和NONE这些比赛的ANSI标准,这是奇怪的,需要额外FROM和FOR关键字,而不是简单的“正常”功能的语义。

<character substring function> ::=
    SUBSTRING <left paren> <character value expression> FROM <start position>
    [ FOR <string length> ] <right paren>
Run Code Online (Sandbox Code Playgroud)

Postgresql 是我所知道的唯一一个支持该语法的数据库。