首页 > 解决方案 > 当我在 Tableau Prep 中运行自定义 SQL 查询时,为什么某些列包含空白值?如何检索正确的(非空)值?

问题描述

一些背景...我们正在尝试连接到 MySQL 数据库并提取患者信息。在 Tableau Prep 中,我们成功连接到数据库,然后创建自定义 SQL 输入。自定义查询从包含加密数据的表中的列中选择值。通常在其他情况下(例如在我们的后端代码中)提取此数据时,我们使用 AES_DECRYPT 作为 SELECT 查询的一部分对其进行解密。该查询通常如下所示(有时会有比这更多的字段,但它们都将遵循相同的一般模式):

SELECT CAST(AES_DECRYPT(UNHEX(`myfield`), 'ThisIsWhereTheKeyWouldGo') AS CHAR) AS myfield FROM `mytable`

顺便说一下,这些名称和下面的任何值只是示例……出于隐私原因,我无法共享实际数据或名称。话虽如此,当我在 MySQL 工作台中运行此查询时,结果是我期望的非空字符串、非 null 值的列(当然,如果该值实际上是 null 开始时除外)。对于我运行它的任何包含加密值的列都是如此,无论加密字符串的长度如何。即结果看起来像......

+-----------------------------------+
|             myfield               |
+-----------------------------------+
| somedata                          |
| alsodata                          |
| moredata                          |
| ...etc.                           |
+-----------------------------------+

但是,当我复制 EXACT SAME 查询并将其粘贴到 Tableau 的自定义 SQL 窗口中,然后运行它时,我得到的是空字符串值(不是空值,而是空值......而且 Tableau 确实区分了它们)。看不到错误。对于我表中的几乎每一列都是如此。基本上我得到

+-----------------------------------+
|             myfield               |
+-----------------------------------+
|                                   |
|                                   |
|                                   |
|                                   |
+-----------------------------------+

请注意,我说的几乎都是。那是因为我在 Tableau 中运行此查询并获得了我期望的非空、非空字符串结果,所以在同一个精确表中有列。

这对我来说非常令人费解。我正在努力弄清楚为什么 Tableau 可以毫无问题地检索某些列,而如果它们不是空字符串则不能检索其他列。

我也很难理解这是否是我们数据库本身的限制,或者 Tableau 是否存在错误。

我还做了一些交叉检查,粗略的一瞥告诉我,只有原始数据中最初非空的值才会在 Tableau 的结果中显示为空字符串。Tableau 结果中唯一的空值来自原始数据中原本为空的值。

我还测试了字符串的长度是否有所不同(作为空字符串返回的值在原始数据库中有些长,我怀疑它们可能在解密之前被截断)。我从其中一个列中复制了数据,在该列中,我的查询成功检索了所有值(不是空字符串),并将其放入通常作为空字符串返回的列中。该数据仍然以空字符串的形式返回。

那么我应该假设问题出在专栏上吗?除此之外,正确解密的列和未正确解密的列的唯一区别是类型。正确解密的列是 varchar,而不能正确解密的列是 longtext。

目前,对我来说(而且我认为我实际上没有权限......)修改有问题的列的数据类型并查看是否是问题是不可行的。当然,我尝试在我的本地计算机/本地数据库副本上执行此操作,但不幸的是,一些搜索和尝试表明 Tableau Prep 只能使用仅适用于 Windows 的 Tableau Bridge 连接到我的本地 MySQL 数据库。不幸的是,我的工作站是 Macbook。

我仍然觉得奇怪的是,查询在 MySQL 工作台中始终如一,但在 Tableau Prep 中却没有。

所以我想知道是否有其他人遇到过这样的问题,以及你做了什么来解决它。我很难相信我是世界上唯一一个在将 Tableau 连接到 MySQL 数据库和检索加密数据时遇到问题的人。如果唯一的解决方法是更改​​我们的整个数据库以避免某种数据类型,我会感到非常惊讶,并且至少部分地在这里发布以查看是否有其他我可以尝试或检查我不知道的事情,并且只建议我们创建一个新表或更改当前表中的数据类型作为绝对的最后手段。

我也愿意接受涉及 Tableau Desktop 而不是 Tableau Prep 的解决方案。这会有点痛苦,但我会做到的。

我还想知道是否有 Tableau Prep 自定义查询选项的替代方案,例如 AES_DECRYPT 函数的一些内置等效函数,该函数的知名度不足以显示在我的任何谷歌或论坛搜索中。 .在提取数据后我可以用来解密的东西。因为在不尝试解密的情况下提取数据可以正常工作。例如

SELECT `myfield` FROM `mytable`

将在 Tableau 中按预期返回非空字符串,它们显然仍然是加密的。

(在任何人说之前,因为我已经看到一半时间在这里向人们询问事情是如何进行的。

提前感谢您的帮助。

编辑:如果有人需要知道我正在使用 Tableau Prep Builder 2020.1

标签: mysqlencryptionaesdata-visualizationtableau-api

解决方案


推荐阅读