代码之家  ›  专栏  ›  技术社区  ›  ThinkCode

mysql-select*到outfile local?

  •  38
  • ThinkCode  · 技术社区  · 16 年前

    MySQL太棒了!我目前参与了一个主要的服务器迁移,以前,我们的小型数据库与客户机托管在同一台服务器上。
    所以我们曾经这样做: SELECT * INTO OUTFILE .... LOAD DATA INFILE ....

    现在,我们将数据库移到了另一个服务器上, SELECT * INTO OUTFILE .... 不再有效,可以理解-我相信安全原因。 但有趣的是 LOAD DATA INFILE .... 可以更改为 LOAD DATA LOCAL INFILE .... 砰,它工作了。

    我没有抱怨,也没有对MySQL表示厌恶。另一种方法是添加两行额外代码和一个系统调用,形成一个.sql脚本。我只想知道为什么 LOAD DATA LOCAL INFILE 工作,为什么没有这样的事情 SELECT INTO OUTFILE LOCAL ?

    我做了作业,找不到上面问题的直接答案。我也找不到@mysql的功能请求。如果有人能澄清这一点,那就太棒了!

    Mariadb有能力处理这个问题吗?

    6 回复  |  直到 7 年前
        1
  •  52
  •   Teun Zengerink Dhiraj Thakur    13 年前

    从手册中: The SELECT ... INTO OUTFILE 语句的主要目的是让您快速地将表转储到服务器计算机上的文本文件中。如果要在服务器主机以外的某个客户端主机上创建结果文件,则不能使用 SELECT ... INTO OUTFILE . 在这种情况下,您应该使用诸如 mysql -e "SELECT ..." > file_name 在客户机主机上生成文件。“

    http://dev.mysql.com/doc/refman/5.0/en/select.html

    一个例子:

    mysql -h my.db.com -u usrname--password=pass db_name -e 'SELECT foo FROM bar' > /tmp/myfile.txt
    
        2
  •  7
  •   Waverly360    13 年前

    通过传入-s(--silent)选项,您可以使用MySQL控制台实现所需的功能。

    最好还传入-r(--raw)选项,这样特殊字符就不会被转义。您可以使用它来按您想要的方式发送查询。

    mysql-u用户名-h主机名-p-s-r-e“选择concat(‘this’,‘works’)”

    编辑:另外,如果要从输出中删除列名,只需添加另一个-s(mysql-s s-r等)。

        3
  •  5
  •   Theo    16 年前

    你给的路 LOAD DATA INFILE 用于运行服务器的计算机上的文件系统,而不是用于连接的计算机。 LOAD DATA LOCAL INFILE 是用于客户端的计算机,但它要求服务器以正确的设置启动,否则不允许。您可以在这里阅读所有相关信息: http://dev.mysql.com/doc/refman/5.0/en/load-data-local.html

    至于 SELECT INTO OUTFILE 我不知道为什么没有本地版本,而且在连接上可能很难做到。您可以通过 mysqldump 工具,但不是通过向服务器发送SQL。

        4
  •  3
  •   Vajk Hermecz    11 年前

    按照waverly360的建议,将mysql cli与-e选项结合使用是一个很好的选择,但这可能会耗尽内存,并在大的结果中丧生。(没有找到背后的原因)。 如果是这样,并且您需要所有记录,我的解决方案是:mysqldump+mysqldump2csv:

    wget https://raw.githubusercontent.com/jamesmishra/mysqldump-to-csv/master/mysqldump_to_csv.py
    mysqldump -u username -p --host=hostname database table | python mysqldump_to_csv.py > table.csv
    
        5
  •  2
  •   Snowcrash    16 年前

    回复:选择*进入输出文件

    检查mysql是否有权限将文件写入服务器上的outfile目录。

        6
  •  0
  •   Hirnhamster    8 年前

    因为我发现自己经常寻找这个确切的问题(希望我之前错过了一些事情),我最终决定花时间写一篇 small gist to export MySQL queries as CSV files 有点像 https://stackoverflow.com/a/28168869 但是基于php和更多的选项。这对我的用例很重要,因为我需要能够微调csv参数(分隔符、空值处理),并且文件需要实际上是有效的csv,因此 CONCAT 因为如果值包含换行符或csv分隔符,它不会生成有效的csv文件,所以这是不够的。

    警告:要求在服务器上安装PHP! (可通过 php -v )

    “安装” mysql2csv 通过

    wget https://gist.githubusercontent.com/paslandau/37bf787eab1b84fc7ae679d1823cf401/raw/29a48bb0a43f6750858e1ddec054d3552f3cbc45/mysql2csv -O mysql2csv -q && (sha256sum mysql2csv | cmp <(echo "b109535b29733bd596ecc8608e008732e617e97906f119c66dd7cf6ab2865a65  mysql2csv") || (echo "ERROR comparing hash, Found:" ;sha256sum mysql2csv) ) && chmod +x mysql2csv
    

    (下载gist的内容,检查校验和并使其可执行)

    使用实例

    ./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"
    

    生成文件 /tmp/result.csv 带内容

    foo,bar
    1,2
    

    参考帮助

    ./mysql2csv --help
    Helper command to export data for an arbitrary mysql query into a CSV file.
    Especially helpful if the use of "SELECT ... INTO OUTFILE" is not an option, e.g.
    because the mysql server is running on a remote host.
    
    Usage example:
    ./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"
    
    cat /tmp/result.csv
    
    Options:
            -q,--query=name [required]
                    The query string to extract data from mysql.
            -h,--host=name
                    (Default: 127.0.0.1) The hostname of the mysql server.
            -D,--database=name
                    The default database.
            -P,--port=name
                    (Default: 3306) The port of the mysql server.
            -u,--user=name
                    The username to connect to the mysql server.
            -p,--password=name
                    The password to connect to the mysql server.
            -F,--file=name
                    (Default: php://stdout) The filename to export the query result to ('php://stdout' prints to console).
            -L,--delimiter=name
                    (Default: ,) The CSV delimiter.
            -C,--enclosure=name
                    (Default: ") The CSV enclosure (that is used to enclose values that contain special characters).
            -E,--escape=name
                    (Default: \) The CSV escape character.
            -N,--null=name
                    (Default: \N) The value that is used to replace NULL values in the CSV file.
            -H,--header=name
                    (Default: 1) If '0', the resulting CSV file does not contain headers.
            --help
                    Prints the help for this command.