mysql - docker 组成 : MySQL Syntax Error "DELIMITER" On Line 1

标签 mysql docker phpmyadmin

我有一个问题,我希望 Docker Compose 在设置 MySQL 后直接导入我的 Database.sql 文件。但它总是抛出错误:

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 'DELIMITER |' at line 1

但不知何故,当我在浏览器中通过 phpMyAdmin 导入它时,它工作得很好。

这是我的docker-compose.yml:

version: "3.2"
services:
  php:
    build: './php/'
    networks:
      - backend
    volumes:
      - ./www/:/var/www/html/
  apache:
    build: './apache/'
    depends_on:
      - php
      - mysql
    networks:
      - frontend
      - backend
    ports:
      - "8081:80"
    volumes:
      - ./www/:/var/www/html/
  mysql:
    image: mysql:5.7
    volumes:
      - ./mysql:/tmp/database
    command: mysqld --max_allowed_packet=32505856 --user=root --init-file="/tmp/database/schema.sql"
    networks:
      - backend
    environment:
      - MYSQL_ROOT_PASSWORD=root
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links:
        - mysql
    ports:
      - '8082:80'
    environment:
      MYSQL_USERNAME: root
      MYSQL_ROOT_PASSWORD: root
      PMA_HOST: mysql
    networks:
      - backend
networks:
  frontend:
  backend:

这是我执行的 .sql 文件的示例片段:

-- phpMyAdmin SQL Dump
-- version 4.8.2
-- https://www.phpmyadmin.net/
--
-- Host: mysql
-- Generation Time: Aug 20, 2018 at 08:30 AM
-- Server version: 5.7.23
-- PHP Version: 7.2.6
DELIMITER $$

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";

--
-- Database: `database`
--
CREATE DATABASE IF NOT EXISTS `databasetest` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `databasetest`;

--
-- Procedures
--
DROP PROCEDURE IF EXISTS `sp_filestatus_get`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_filestatus_get` (IN `filename_name` VARCHAR(500), IN `kampagne_name` VARCHAR(100), IN `outlet_name` VARCHAR(100))  NO SQL

... Some more stuff

END;

我是否遗漏了配置中的某些内容?或者为什么它不能与 compose 一起使用,但直接在 phpMyAdmin 中可以使用?

最佳答案

sql API 不直接支持 DELIMETER,因为该语句的支持是由它在 phpmyadmin 中工作的客户端定义的,因为它支持该语句。默认的 mysql 客户端使用 delimeter 语句,按照 Stored programs defining 中的建议步骤操作并相应地更新 sql 文件(CREATE PROCEDURE 应替换为您的 sql 语句)。

mysql> delimiter //

mysql> CREATE PROCEDURE dorepeat(p1 INT)
    -> BEGIN
    ->   SET @x = 0;
    ->   REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

根据您使用的脚本,您必须以不同于现在的方式处理分隔符:

替换

DROP PROCEDURE IF EXISTS `sp_filestatus_get`$$

DROP PROCEDURE IF EXISTS `sp_filestatus_get`;

此外,请将 END; 替换为 END $$ 并在文件末尾添加 DELIMITER ;

这里有一些链接,您可以在 init sql 脚本中找到需要调整的内容:

关于mysql - docker 组成 : MySQL Syntax Error "DELIMITER" On Line 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51890916/

相关文章:

javascript - NodeJS 和 MySQL 中标记系统的 3 个表更新的最佳方法

php - CodeIgniter 事件记录 'undefined property'

docker - Rabbitmq - Docker 连接在端口 5672 上被拒绝

php - 如何使用 mysql 并更新 autonum 字段在现有行之间插入新行

php - phpMyAdmin 和 php 中的不同结果

mysql,查询两个链接表从第一个返回 id 的秒详细信息满足这个但不是这个条件

php - 如何使用 php 代码或在 codeigniter 中以 .sql 扩展名导出 mysql 数据库

mysql - 无法从 Node Express 应用程序访问 mysql 数据库

docker - Dockerfile 中的路径解释

php - php如何将图片上传到数据库