将Mysql查询结果导出到Excel?

2023-12-13

我的要求是存储查询的整个结果

SELECT * FROM document 
WHERE documentid IN (SELECT * FROM TaskResult WHERE taskResult = 2429)

到 Excel 文件。


实现此目的的典型方法是导出为 CSV,然后将 CSV 加载到 Excel 中。

TL;DR:

  • For a 服务器端来自 Excel 的 CSV 文件SELECT查询,运行这个:

    SELECT ... FROM someTable WHERE etc
    INTO OUTFILE 'someTableExport.csv' CHARACTER SET utf8mb4
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY ''
    LINES TERMINATED BY '\r\n';
    
  • For a 服务器端Excel 友好的 CSV 文件使用mysqldump像这样:

    mysqldump -h serverHostName -u mysqlUserName -p --tab="someTableExport.csv" --fields-optionally-enclosed-by=0x22 --fields-escaped-by='' --fields-terminated-by=0x2C --lines-terminated-by=0x0D0A --databases databaseName --tables table1 table2 table3
    
  • For a 客户端Excel 友好的 CSV 文件使用mysqlsh(MySQL Shell)像这样:

    mysqlsh --user="mysqlUserName" --host="serverHostName" --port=3306 --schema="databaseName"
    # Once connected, run this:
    util.exportTable("tableName", "file:///C:/Users/You/Desktop/test.csv", { dialect: "csv", fieldsEscapedBy: ""})
    

首先,关于 Excel 的警告:

Excel 与 MySQL 的默认 CSV 格式:

Remember that Excel has its own underdocumented ideas about how CSV files should be formatted and these stand in-contrast to MySQL's own ideas about CSV files; though Excel is largely compliant with RFC 4180 you still need to prod and poke MySQL and its associated tooling to generate CSV files that Excel won't misinterpret:

Excel MySQL (default) MySQL (when configured)
SQL NULL Zero-length value Literal \N Literal NULL
Text values that don't contain commas, quotes, or line-breaks Not enclosed Not enclosed Enclosed in "
Text values that contain commas, quotes, or line-breaks Enclosed in " Not enclosed Enclosed in "
Non-text values Not enclosed Not enclosed Not enclosed
Line-breaks and tabs in text values Literal Escaped as [\r]\n Literal
Double-quotes in text values Doubled-up "" Escaped as \" Doubled-up ""
Field separator , \t (Tab) ,
Record separator \r\n \n \r\n
Commas inside non-quoted text values (Results in broken table data) Not escaped Will always be quoted if the value contains a comma
UTF-8 support
  • Excel 2007-2013:- 需要前导 UTF-8 BOM
  • Excel 2016+: - Handles BOM-less UTF-8 with some prodding
Use utf8mb4.
Do not specify the older broken utf8 or utf8mb3 encodings.
Use utf8mb4

根据上表,MySQLcan生成 Excel 友好的 CSV 文件,但 SQL 除外NULLs 始终会被 Excel 解释为文字文本,尽管使用 PowerQuery 甚至只是简单地使用查找和替换在 Excel 中将其替换为空单元格。

Excel 和specialCSV 文本标记

  • 如果您的任何文本值开头为=那么你需要手动捏造这些,因为即使引用 Excel 也会解释下面的文本=作为公式而不是文字文本.
  • 还要留意前导文本如sep= too.

Excel 和 UTF-8 编码:

令人惊讶的是,直到 Excel 31 岁(Excel 2016),Excel 才添加了对文件中 UTF-8 编码的内置支持无需 BOM,但它仍然默认使用系统默认的非 Unicode 编码(例如Windows-1252).

  • When importing CSV into Excel, be sure to select Codepage 65001 for correct UTF-8 handling as Excel still defaults to non-Unicode-based codepages for some reason.
    • Note that opening a CSV file in Excel won't display the Text Import Wizard. (As of Excel 2021) you need to copy-and-paste CSV text into Excel and use the popup menu to use the legacy (frozen-in-1994) wizard, or use Data > From Text/CSV on the ribbon to use the newer (but less flexible, imo) PowerQuery-based CSV import wizard:

      • Excel 2007-2013 Excel 2016+
        enter image description here enter image description here

您的选择:

Option SELECT INTO OUTFILE mysqldump --tab mysqldump > file.csv mysqlsh MySQL Workbench
Server-side CSV True True True True Broken
Remote (client-side) CSV False False False True Broken
MySQL Server version support All versions All versions All versions Only 5.7 and later All versions

选项 1:使用导出 Excel 友好的 CSVINTO OUTFILE:

  • You can do a server-side CSV export by using the INTO OUTFILE clause of a SELECT query.
    • 因为这是由 MySQL 服务器执行的“正常”SQL,所以无论您使用什么 MySQL 客户端工具,它都可以工作,因此您不需要安装 MySQL Workbench。
    • ...但是因为这是服务器端导出,您需要拥有写入服务器文件系统的权限,而您可能没有权限,在这种情况下,请考虑使用专业导出工具,例如mysqldump(见下文)。
  • MySQL's OUTFILE clause has a number of optional subclauses that must be specified for some-level of compatibility with Excel's own CSV reader:
    • FIELDS...
      • TERMINATED BY(默认:'\t', 用于 Excel',')
      • [OPTIONALLY] ENCLOSED BY(默认:'', 应该'"' with the OPTIONALLY关键词)
      • ESCAPED BY(默认:'\\', 用于 Excel'')
    • LINES...
      • TERMINATED BY(默认:'\n', 用于 Excel'\r\n')
      • STARTING BY(默认:'',对于 Excel,您可以省略此项或使用 MySQL 默认值)。
    • Do not use ENCLOSED BY(没有前面的OPTIONALLY关键字),因为这将引用所有值,无论类型如何(即它将引用int值,这将导致 Excel(默认情况下)将它们解释为文本(字符串)而不是数字)。
  • 注意,没有选项指示MySQL输出SQLNULLs 作为空字段,因此 Excel 会将它们解释为不带引号的文本字符串(即"NULL"),因此您需要在导入文件后在 Excel 中执行查找并替换。
  • If your INTO OUTFILE <fileName>文件名(例如'someTableExport.csv'上面)不是绝对路径,那么它将被保存到您的数据库中datadir目录。跑步SHOW VARIABLES LIKE 'datadir';获取路径。请注意,您可能不一定具有该目录下新文件的读/写权限。

所以你的查询(SELECT * FROM document WHERE documentid...)看起来像这样:

SELECT
    *
FROM
    document 
WHERE
    documentid IN ( SELECT documentid FROM TaskResult WHERE taskResult = 2429 )
INTO
    OUTFILE 'someTableExport.csv'
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"', ESCAPED BY ''
    LINES TERMINATED BY '\r\n';

选项 2:使用导出 Excel 友好的 CSVmysqldump:

  • 使用以下命令将转储存储到 CSV 文件中--tab命令行选项,as per mysqldump的文档.
  • Unfortunately mysqldump's --tab= option won't work for remote MySQL servers: this is because --tab="fileName.csv" can only represent a path on the server.
    • 当你can use stdout重定向以生成本地文件(即mysqldump --etc > output.csv)你不能使用--fields-terminated-by和其他格式选项stdout,使其对于 Excel 兼容的输出毫无用处。因此,如果您身处偏远地区且无法ssh-那么你将需要使用MySQL 外壳 (mysqlsh)代替(见下文)。
  • 注意mysqldump不支持SELECT转储数据的查询:itdoes支持简单WHERE式过滤器--where=<expr>选项,但这不支持使用过滤之类的东西INNER JOIN(尽管作为解决方法,你可以SELECT进入一个新表,然后运行mysqldump在那张新桌子上。请注意,您不能使用TEMPORARY TABLE with mysqldump 因为临时表是连接范围的).

在OP的情况下,由于固有的局限性--where=命令行选项有效,他们会想要导出两个表(document and TaskResult)并在 Excel PowerQuery 或类似工具中应用其过滤逻辑。像这样执行导出:

mysqldump -h serverHostName -u mysqlUserName -p --tab="someTableExport.csv" --fields-optionally-enclosed-by=0x22 --fields-escaped-by='' --fields-terminated-by=0x2C --lines-terminated-by=0x0D0A --databases databaseName --tables document TaskResult
  • 上面的命令行应该可以工作不加修改在Windows中'cmd.exe, macOS 的zsh, and bash在 Linux 上 - 提供mysqldump在你的PATH.

  • 使用十六进制编码的字符意味着避免了弄清楚如何在 shell 和终端中将双引号和换行符作为文字传递的麻烦(0x22 is ", 0x2C is ,, and 0x0D0A is \r\n).

  • Avoid使用--password=<value> (aka -p<value>) 选项 这mysqldump命令行,因为这意味着您的密码将以明文形式保存到您的终端或控制台历史文件中,这是一个明显的巨大安全风险.

    • 因此,如果您处于交互式命令行会话中需要指定密码,那么mysqldump程序运行时会立即提示您输入密码,因此不会将其保存到您的历史文件中。
    • 如果你想跑步mysqldump在非交互式上下文中(例如,在 Web 应用程序、守护进程或其他进程中),那么(通常)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将Mysql查询结果导出到Excel? 的相关文章

  • 索引行和列意外结果

    我试图理解以下行为 如果我有以下数据 A B a 1 b 2 c 3 如果我使用 INDEX A 1 B 3 它将正确显示整个范围 如果我使用 INDEX A 1 B 3 1 它将正确显示两列第一行的数据 如果我使用 INDEX A 1 B
  • 使用Perl/DBI/MySQL/InnoDB查找外键信息

    我想以编程方式查找 MySQL 数据库中特定 InnoDB 表的外键 我正在使用 Perl 我偶然发现 dbh gt foreign key info 我刚刚尝试使用它 但似乎有点错误 它不会返回 ON DELETE 和 ON UPDATE
  • MySQL 排序顺序 - 排序规则?

    我在对 MySQL 中的 char 字段进行排序时遇到困难 问题是重音字符与非重音字符混淆 例如 Abc bd Acc 我认为这可能与整理有关 所以我将表格的排序规则更改为utf8 ut8 bin 看完之后这个帖子 https stacko
  • 如何在 MySQL 中测试 Select for Update

    我正在表演SELECT FOR UPDATE或 InnoDB 表的行级锁定 我的目的是只有一个请求可以读取同一行 因此 如果两个用户同时请求相同的数据 其中只有一个人获取数据 即第一个触发查询的人 但是我如何测试锁定是否已放置 因为我正在通
  • 非常大的字段会对 MySQL 数据库产生负面影响吗?

    我目前正在使用 Django 构建一个网站 并希望托管用户生物样式页面 该页面可能长达几 KB 这些字段不一定需要搜索 但在查找用户名时确实需要提供 将这些数据存储在数据库中会产生负面影响吗 如果我使用带有数据库链接的静态文本文件 我的服务
  • MySQL中如何声明变量?

    如何在mysql中声明一个变量 以便我的第二个查询可以使用它 我想写一些类似的东西 SET start 1 SET finish 10 SELECT FROM places WHERE place BETWEEN start AND fin
  • 用 pandas DataFrame 替换 mysql 数据库表中的行

    Python 版本 2 7 6 熊猫版本 0 17 1 MySQLdb 版本 1 2 5 在我的数据库中 PRODUCT 我有一张桌子 XML FEED 表 XML FEED 很大 数百万条记录 我有一个 pandas DataFrame
  • PHP MySql 百分比

    我的问题是关于百分比 我不是专家 所以我会尽力以更好的方式进行解释 我的 mysql 服务器中有一个表 假设有 700 条记录 如下所示 Name country language Birth Lucy UK EN 1980 Mari Ca
  • 从Excel单元格中提取固定长度的数字

    一些类似名称的线程 但仍然无法解决我的问题 我需要从 Excel 字符串中提取固定长度的 NUMBER 值 在我的场景中为 8 位数字 为此目的提供了以下 Excel 公式 MID A1 FIND SUBSTITUTE SUBSTITUTE
  • 如何在MYSQL中将整个字符串小写并保持第一个大写[重复]

    这个问题在这里已经有答案了 我的表栏目 我预期的输出会在列中发生变化 Smith Allen Doyle Dennis Baker Waker 这是我尝试过的 但不起作用 UPDATE TABLE employee SET last nam
  • 如何获取活跃的Excel实例?

    我有一个 C 应用程序 该应用程序根据用户需求将信息粘贴到 excel 背后的逻辑是这样的 如果没有正在运行的 excel 实例 它会创建一个实例并粘贴到该实例 如果只有一个实例在运行 它会尝试获取该实例并使用它 这是我用来执行此操作的代码
  • 如何检测Mysql/innodb中的死锁?

    我知道在 Innodb 中使用事务时不可避免地会发生死锁 并且如果应用程序代码正确处理死锁 它们是无害的 正如手册所说 只需再试一次 所以我想知道 如何检测死锁 死锁是否会发出一些特殊的 mysql 错误号 如果重要的话 我正在使用 PHP
  • 删除行导致锁超时

    当我尝试从表中删除行时 我不断收到这些错误 这里的特殊情况是我可能同时运行5个进程 该表本身是一个 Innodb 表 约有 450 万行 我的 WHERE 子句中使用的列没有索引 其他指数按预期运行 这是在事务中完成的 首先删除记录 然后插
  • 从 X、Y、Z 数据、Excel 或其他工具进行 3D 绘图

    我的数据看起来像这样 1000 13 75 2 1000 21 79 21 1000 29 80 02 5000 29 87 9 5000 37 88 54 5000 45 88 56 10000 29 90 11 10000 37 90
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • mysql自动存储记录创建时间戳

    mysql 有什么方法可以在创建记录时自动将时间戳存储在记录行中 我试图使用时间戳 数据类型 和 current timestamp 作为默认值 但后来意识到每次更新记录时都会更新 我只需要一些可以存储创建时间戳的东西 Thanks Set
  • 有没有一种方法可以将这些列转换为数据格式?

    有没有办法将这些列转换为数据格式 gg mm aaaa 时 分 秒 日期 20220601 gt gt gt gt 2022 06 01 小时 3047 gt gt gt gt gt 00 30 47 时 分 秒 我对 B 列有严重问题 我
  • MySQL 追加字符串

    How can I append a string to the end of an existing table value Let s say I have the table below And let s say that Mari
  • 在 Excel 中查找结果将行复制到另一张工作表

    我需要一些帮助将数据从一个 Excel 工作表复制到另一个 例如 样本数据 A B C 1 aaa bbb ddd 2 bbb ccc eee 2 bbb ccc eee 3 ccc fff rrr 4 ccc fff ttt 5 ddd
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同

随机推荐

  • 如何获取android中存储目录的路径

    有什么方法可以得到 storage 目录 我尝试过Environment getExternalStorageDirectory 但它返回 storage emulated 0我知道我可以使用file getParent 但由于某种原因我不
  • ADF 在 git 模式下发布混乱

    在 git 模式下 当我们想要测试管道时 ADF 会强制我们先发布 我的理解是 发布操作做了两件事 按照给定保存到本地 ADF DEV here 在分支 adf publish 我们的分支 中创建arm模板 指定 但要启用 发布 按钮 我们
  • 释放方法返回的对象

    好吧 我知道这个问题的答案应该是显而易见的 但我需要朝着正确的方向一点推动 我发现自己编写了很多遵循以下模式的方法 NSThing myMethod NSThing thing NSthing alloc init do some stuf
  • 使用 /proc/meminfo 读取 Android 设备的 RAM 总量

    我正在考虑读取 Android 设备的物理 RAM 总量 据我了解 这些信息存储在 proc meminfo中 我怎样才能阅读它 尝试这个 public void getTotalMemory String str1 proc meminf
  • 如何循环返回主菜单?

    我想知道这是否是循环回到 python 主菜单的正确方法 选择选项并完成任务后 脚本需要返回主菜单而不是退出 usr bin python def mainmenu print 1 Scan print 2 Ping print 3 Exi
  • 是否可以在 POST Json 中附加文件?

    我有一堆 JSON 序列化对象 格式的数据 我通过以下方式将此数据发送到服务器POST带标题的方法 Content Type application json 是否可以将文件附加到正文请求并立即发送 或者 JSON 数据建议仅发送文本数据
  • AttachConsole 错误 5:访问被拒绝

    我正在 Visual Studio 2013 中使用 C 控制台应用程序 在 Windows 上工作 首先我使用分离控制台FreeConsole 有用 然后 调用AllocConsole as FreeConsole 然后 AttachCo
  • 在字符列上合并大型 data.tables 会导致段错误

    我正在使用 R 版本 3 3 3 尽管我已经在 3 4 0 上复制了这个问题 并且data tableCygwin 上的版本 1 10 4 Edit 下面的评论表明这可能是 Cygwin 特有的 我需要通过字母数字 ID 列合并两个数据表
  • 为什么 jhat 的 -baseline 选项不起作用?

    为什么每个对象似乎都被标记为新对象 而不仅仅是第二个快照中但不在我的基准快照中的对象 在网上查看 我看到一些建议 我需要使用 hprof 而不是 jmap 来进行内存转储 但 hprof 似乎以完全相同的格式生成转储 这是JDK 1 6 0
  • 设置 PHP ImageMagick tmp 目录

    我正在尝试设置 ImageMagick 用于转换文件的临时目录 目前 在转换大型 PDF 时 临时文件夹很快就会达到 2 或 3 TB 这对于服务器磁盘来说太大了 因此我计划使用 AWS EFS 来存储所有内容 我将 EFS 驱动器安装在
  • 绘制隐式方程[重复]

    这个问题在这里已经有答案了 我需要在Python3中画一些曲线 我很习惯matplotlib pyplot 但我以前从未画过这样的东西 我真的很感激一些提示 特别是如何以 整洁 的方式编码的提示 和帮助 有一个例子 让我们用一颗心 x 2
  • Wix:升级时 Windows 服务有时会被卸载

    我们使用 Wix 安装我们的软件 我们的设置还安装了 Windows 服务 为了允许用户更改 Windows 服务的登录信息 我们只想在首次安装时安装该服务 并仅在卸载时将其删除 对于升级 我们手动停止服务 以便可以升级文件 我们已经做到了
  • MIPS 上的多精度算法

    我只是想在本机 MIPS 上实现多精度算术 假使 假设 一个 64 位整数位于寄存器 12 和 13 中 另一个 64 位整数位于寄存器 14 和 15 中 总和将被放置在寄存器 10 和 11 中 64 位整数的最高有效字位于偶数寄存器中
  • JSON.stringify 的逆向?

    我正在用 stringyfing 一个像这样的物体 foo bar 如何将字符串转回对象 你需要JSON parse 您的有效 JSON 字符串 var str hello world try var obj JSON parse str
  • 他们是如何在 http://artofflightmovie.com/ 中实现这些效果的?

    我一直试图了解他们是如何实现这些效果的http artofflightmovie com 到目前为止还没有成功 我什至不知道该通过谷歌搜索什么来寻求帮助 任何人都可以详细说明它 并可能放置指向插件 教程 其他网站做同样事情的链接吗 已经有一
  • 从 Python 中的命名空间对象导入变量

    假设我有一个命名空间args我通过调用获得的parser parse args 它解析命令行参数 如何将此命名空间中的所有变量导入到当前命名空间 e g parser add argument p some parameter defaul
  • 派生的 C++ 类如何通过基指针克隆自身?

    这就是我想要做的 此代码不起作用 class Base virtual Base clone return new Base this virtual void ID printf BASE class Derived publc Base
  • 用于打开 MSG 文件的 C# Outlook 互操作和 OpenSharedItem [已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 为了使用 OpenSharedItem Outlook 互操作方法 我可以遵循任何教程或资源吗 我的目标是使用它读取 MSG 文件 因为它可以显然
  • Gradle 同步失败找不到约束布局:1.0.0-alpha2

    问题 Error Could not find com android support constraint constraint layout 1 0 0 alpha2 Required by myapp app unspecified
  • 将Mysql查询结果导出到Excel?

    我的要求是存储查询的整个结果 SELECT FROM document WHERE documentid IN SELECT FROM TaskResult WHERE taskResult 2429 到 Excel 文件 实现此目的的典型