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

时间:2018-09-26 03:52:25

标签: 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');

我希望代码选择像这样:

Select Substring(id,1) from test

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

Select Substring(id,2) from test

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

3 个答案:

答案 0 :(得分:2)

不确定您看到的内容,但是W3Schools docs for MySql显示以下内容:

  

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

MySql Official看起来像这样:

  

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

还有其他一些东西

SQL Server Official

  

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

SQL Server W3Schools

  

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

Oracle Official

  

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

其中的 NONE ansi standard匹配,这很奇怪,它需要额外的FROMFOR关键字,而不是简单的“正常”函数语义。 / p>

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

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

答案 1 :(得分:0)

W3schools在我看到它时要求1:

enter image description here

https://www.w3schools.com/sql/func_mysql_substring.asp

答案 2 :(得分:0)

mysql的子字符串语法是

SUBSTR(string,position)
SUBSTR(string,position,length)

对于mysql来说,子字符串从位置1开始工作是正确的(w3school是正确的)。现在这是您的观点。 您如何看待子字符串中的“位置”值。

POSITION中的数字类似于

根据您的第一个查询

Select Substring(id,1) from test 

这表示从位置1开始

(注:请记住,此位置值不表示从位置1擦除或(删除),而是表示从起始位置1选择)。

所以结果是M1,M2,M128,M129

根据您的第二个查询

Select Substring(id,2) from test 

此位置2的意思是“从1.开始,将位置1的id值擦除到位置2(请记住,直到2不带2)”

结果是1,2,128,129(只是删除了位置1的值)

最后的例子是

SELECT SUBSTRING('Engineer',5);

因此它将从位置1开始删除字符“ E”,直到位置5表示“ N”(位置5的未擦除值)

结果是“需要”