MySQL 및 Maria에서 상호 호환되는 가비지 문자열 함수를 생성하는 동안 오류가 발생했습니다.DB
아시다시피 MariaDB(5.5-)의 소형 버전은 MySQL과 호환성이 있습니다(결함도 발견했지만 90%라고 합니다).환경에서는 AWS RDS의 MySQL과 로컬 Dev 서버와 Dev 박스의 Maria를 모두 사용하고 있습니다.현재 랜덤 데이터로 행을 자동 입력하는 기능을 해킹하려고 합니다.
테이블 구조는 꽤 단순할 것입니다.이렇게요.
DROP DATABASE IF EXISTS `foodb`;
CREATE DATABASE `foodb`;
USE `foodb`;
DROP TABLE IF EXISTS `footable`;
CREATE TABLE `footable` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`garbage` varchar(128) DEFAULT garbageString(),
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
함수의 위치garbageString()
이 정도일 것이다
DROP FUNCTION IF EXISTS garbageString;
CREATE FUNCTION garbageString($length int)
RETURNS varchar(128)
BEGIN
SET @chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
SET @charLen = length(@chars);
SET @randomString = '';
WHILE length(@randomString) < $length DO
SET @randomString = concat(@randomString, substring(@chars,CEILING(RAND() * @charLen),1));
END WHILE;
RETURN @randomString ;
END;
MySQL과 Maria 둘 다 이 기능을 실행하려고 하는데, 여기 MY의 오류 덤프가 있습니다.
MySQL [foodatabase]> CREATE FUNCTION garbageString($length int)
-> RETURNS varchar(128)
-> BEGIN
->
-> SET @chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
ERROR 1064 (42000): 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 5
MySQL [foodatabase]> SET @charLen = length(@chars);
Query OK, 0 rows affected (0.03 sec)
MySQL [foodatabase]>
MySQL [foodatabase]> SET @randomString = '';
Query OK, 0 rows affected (0.03 sec)
MySQL [foodatabase]>
MySQL [foodatabase]> WHILE length(@randomString) < $length DO
-> SET @randomString = concat(@randomString, substring(@chars,CEILING(RAND() * @charLen),1));
ERROR 1064 (42000): 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 'WHILE length(@randomString) < $length DO
SET @randomString = concat(@rando' at line 1
MySQL [foodatabase]> END WHILE;
ERROR 1064 (42000): 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 'END WHILE' at line 1
MySQL [foodatabase]>
MySQL [foodatabase]> RETURN @randomString ;
ERROR 1064 (42000): 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 'RETURN @randomString' at line 1
MySQL [foodatabase]> END;
그리고 여기 마리아가 보낸 것이 있다.
MariaDB [foodatabase]> CREATE FUNCTION garbageString($length int)
-> RETURNS varchar(128)
-> BEGIN
->
-> SET @chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 5
MariaDB [foodatabase]> SET @charLen = length(@chars);
Query OK, 0 rows affected (0.00 sec)
MariaDB [foodatabase]>
MariaDB [foodatabase]> SET @randomString = '';
Query OK, 0 rows affected (0.00 sec)
MariaDB [foodatabase]>
MariaDB [foodatabase]> WHILE length(@randomString) < $length DO
-> SET @randomString = concat(@randomString, substring(@chars,CEILING(RAND() * @charLen),1));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'WHILE length(@randomString) < $length DO
SET @randomString = concat(@rando' at line 1
MariaDB [foodatabase]> END WHILE;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'END WHILE' at line 1
MariaDB [foodatabase]>
MariaDB [foodatabase]> RETURN @randomString ;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'RETURN @randomString' at line 1
MariaDB [foodatabase]> END;
이 기능을 작동시키고 두 DB 유형 모두에서 작동시킬 수 있는 방법이 있습니까?
둘 다 같은 부위에서 질식하고 있는 것 같은데 예상치 못한 일이 생기지 않았으면 좋겠어요
cmdline 클라이언트를 사용하여 함수 또는 절차를 정의하는 경우,DELIMITER
명령줄 클라이언트는 현재 쿼리 딜리미터 입력을 체크하고 이 시점에서 여러 쿼리를 분할하여1개씩 서버로 쿼리를 전송합니다.
일반적인 딜리미터는 다음과 같습니다.;
단, ANSI 프로시저 언어에서는 명령 딜리미터로도 사용되므로 프로시저 코드 자체는 유효한 SQL 문이 아닌 작은 페이스를 분할할 수 있습니다.따라서 클라이언트 측 딜리미터를 다른 것으로 변경해야 합니다.//
:
DELIMITER //
그 후, 현재 발생하고 있는 에러 없이, 순서 텍스트를 올바르게 입력할 수 있습니다.그 마지막에, 순서 텍스트를 추가합니다.//
클라이언트에 완전한 프로시저 텍스트를 단일 스테이트먼트로 서버에 송신하도록 지시합니다.
그런 다음 딜리미터를 다음과 같이 다시 변경할 수 있습니다.;
원하는 경우:
DELIMITER ;
언급URL : https://stackoverflow.com/questions/21504218/error-creating-a-cross-compatible-garbage-string-function-in-mysql-and-mariadb
'source' 카테고리의 다른 글
부동값을 인쇄할 때 과학적 표기법을 사용하지 않는 방법은 무엇입니까? (0) | 2022.11.15 |
---|---|
Java에서 INI 파일을 해석하는 가장 쉬운 방법은 무엇입니까? (0) | 2022.11.15 |
Composer - 요청된 PHP 확장 mbstring이 시스템에 없습니다. (0) | 2022.11.15 |
http를 통한 파일에 대한 직접 액세스를 차단하지만 php 스크립트 액세스를 허용합니다. (0) | 2022.11.15 |
java.io의 자바에서의 mkdir()와 mkdirs()의 차이.파일 (0) | 2022.11.15 |