关于MySQL的问题(一)

不知道你有没有遇到这种情况:

错误代码: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 4

如果有,那真是太好了!

是不是怎么改都不对!其实就是版本的问题。

这是mysql5版本与mysql8的区别之一。

不过,一般不会出现,只有当你创建函数、存储过程或是触发器的时候,这个弊端才会显现出来。

放个例子演示一下:

创建一个函数,参数为学号,使函数实现通过学号查学生姓名,并调用该函数查询学号“00001”和“00002”的姓名;

CREATE FUNCTION get_name(NO CHAR(20),role CHAR(20))RETURNS CHAR(20) 
READS SQL DATA
BEGIN
	DECLARE NAME CHAR(20);
	IF('student'=role) THEN -- find student name
		SELECT sname INTO NAME FROM student WHERE sno=NO;
	ELSEIF('teacher'=role) THEN -- find teacher name
		SELECT tname INTO NAME FROM teacher WHERE tno=NO;
	ELSE SET NAME='输入有误!';
	END IF;
RETURN NAME;
END;

当你运行如上语句时,就会报错,怎么改都不行。别改了,很可能不是你的错,而是版本问题。

解决方案如下:

法一:

DELIMITER $$
CREATE FUNCTION get_name(NO CHAR(20),role CHAR(20))RETURNS CHAR(20) 
READS SQL DATA
BEGIN
	DECLARE NAME CHAR(20);
	IF('student'=role) THEN -- find student name
		SELECT sname INTO NAME FROM student WHERE sno=NO;
	ELSEIF('teacher'=role) THEN -- find teacher name
		SELECT tname INTO NAME FROM teacher WHERE tno=NO;
	ELSE SET NAME='输入有误!';
	END IF;
RETURN NAME;
END;

没错,主要添加了DELIMITER $$,就可以正常运行了,不信你试试!

法二:

DELIMITER T5_1
CREATE FUNCTION get_student_name_by_id(student_id VARCHAR(10)) RETURNS VARCHAR(50)
BEGIN
  DECLARE student_name VARCHAR(50);
  SELECT CONVERT(SName USING utf8) INTO student_name FROM Student WHERE SNo = student_id;
  RETURN CONVERT(student_name USING utf8);
END T5_1
DELIMITER ;

注意头尾的细节,其实原理和法一差不多,可以看个人喜欢。

法三:

这是一个“割以永治”的方法。

直接把你的mysql5删了,下载一个mysql8,就可以彻底解决这个问题。

希望我文章对你有所帮助!

猜你喜欢

转载自blog.csdn.net/m0_64206989/article/details/131315406