我使用的是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
但当我在学校或网络上阅读时,它说起点是0。
有人能告诉我为什么吗?
3条答案
按热度按时间dl5txlt91#
不确定您看到了什么,但W3Docs for mysql显示:
笔记
字符串中的第一个位置是1
mysql官方是这样的:
要从中提取子字符串的字符串中的第一个字符的位置被认为是1。
以下是其他一些:
sql server官方
开始
是一个整数或bigint表达式,指定返回字符的起始位置(编号基于1,这意味着表达式中的第一个字符是1)。
sql server学校
开始位置 必修的。开始提取的位置。字符串中的第一个位置是1
甲骨文官员
当位置为0(零)时,则将其视为1。
这些都不符合ansi标准,这很奇怪,需要额外的
FROM
以及FOR
关键字而不是简单的“正常”函数语义。postgresql是我所知道的唯一一个支持这种语法的数据库。
dl5txlt92#
mysql的子字符串语法是
对于mysql来说,子字符串从位置1开始工作是正确的(w3school是正确的)。您是如何看待子字符串中的“position”值的。
位置上的数字是这样工作的
根据你的第一个询问
意思是从位置1开始
(注意:记住此位置值并不意味着从位置1删除或(删除)。它意味着从起始位置1选择)
结果是m1,m2,m128,m129
根据你的第二个问题
位置2表示“从1开始。擦除从位置1到位置2的id值(记住直到2不使用2)
对于结果是1,2128129(刚刚删除位置1值)
最后一个例子是
因此它将从位置1“e”开始擦除字符,直到位置5表示“n”(位置5的未擦除值)
所以结果是‘neer’
3ks5zfa03#
当我看它的时候,它声称1:
https://www.w3schools.com/sql/func_mysql_substring.asp