首页 > 解决方案 > 当我使用子字符串时,起点是 1,而不是零 (0)

问题描述

我使用 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');

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

Select Substring(id,1) from test

结果来自 "M1" -> "M129" 但是当这样的代码:

Select Substring(id,2) from test

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

标签: mysqlsqlsubstring

解决方案


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

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

MySql 官方是这样的:

将要从中提取子字符串的字符串中第一个字符的位置记为 1。

以下是其他一些:

SQL Server 官方

start
是一个整数或 bigint 表达式,它指定返回的字符从哪里开始。(编号从 1 开始,表示表达式中的第一个字符是 1)。

SQL Server W3Schools

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

甲骨文官方

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

而且这些都不符合ansi标准,这很奇怪,需要额外的FROMFOR关键字,而不是简单的“正常”函数语义。

<character substring function> ::=
    SUBSTRING <left paren> <character value expression> FROM <start position>
    [ FOR <string length> ] <right paren>

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


推荐阅读