【问题标题】:In MySQL 8.x the string function FROM_BASE64(str) returns result in hexadecimal form instead of a string在 MySQL 8.x 中,字符串函数 FROM_BASE64(str) 以十六进制形式返回结果而不是字符串
【发布时间】:2021-12-19 03:28:05
【问题描述】:

我有以下疑问 -

SELECT "Abc" AS result;
+--------+
| result |
+--------+
| Abc    |
+--------+

SELECT TO_BASE64("Abc") AS result;
+--------+
| result |
+--------+
| QWJj   |
+--------+

SELECT FROM_BASE64(TO_BASE64("Abc")) AS result;
+----------------+
| result         |
+----------------+
| 0x416263       |
+----------------+

--binary-as-hex mysql 开发站点中的页面显示 -

要禁用十六进制表示法,请使用--skip-binary-as-hex

我尝试了以下但得到错误 -

mysql> SELECT FROM_BASE64(TO_BASE64("Abc")) --skip-binary-as-hex AS result;
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 'as-hex AS result' at line 1
mysql> SELECT FROM_BASE64(TO_BASE64("Abc") --skip-binary-as-hex)  AS result;
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 'as-hex)  AS result' at line 1
mysql> SELECT FROM_BASE64(TO_BASE64("Abc" --skip-binary-as-hex))  AS result;
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 'as-hex))  AS result' at line 1

在同一页面中,他们说我如何使用USING utf8mb4 子句在CHAR()CONVERT() 函数的情况下获得结果,但他们没有说明FROM_BASE64() 函数的任何内容。不过,我试了一下,报错了——

SELECT FROM_BASE64(TO_BASE64("Abc") USING utf8mb4) AS result;
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 'USING utf8mb4) AS result' at line 1

我试过UNHEX()函数-

ELECT UNHEX(FROM_BASE64(TO_BASE64("Abc"))) AS result;
+----------------+
| result         |
+----------------+
| 0x0ABC         |
+----------------+

显然,这不是预期的结果,因为所有人都在大写。这里LCASE() 不能正常工作,因为它会将每个单词都变成小写。

甚至,从 -

可以看出,这个结果不是字符串
SELECT SUBSTRING(UNHEX(FROM_BASE64(TO_BASE64("Abc"))) FROM 4) AS result;
+----------------+
| result         |
+----------------+
| 0x             |
+----------------+

所以唯一的选择似乎是禁用-binary-as-hex

但我找不到这样做的方法。

stackoverflow 中有类似的问题 -

'FROM_BASE64' Function Returns Hex Value

但它在 MySQL 版本 5.6.14 上。我正在使用 MySQL 版本 8.0.27 -

mysql --version
mysql  Ver 8.0.27 for Linux on x86_64 (MySQL Community Server - GPL)

所以我的情况不同。

【问题讨论】:

    标签: mysql binary base64 hex string-function


    【解决方案1】:

    --skip-binary-as-hex 选项将在您从 shell 提示符打开 mysql 命令时用作 mysql 命令的一个选项。它不是在 SQL 语法中使用的选项。见https://dev.mysql.com/doc/refman/8.0/en/mysql-command-options.html#option_mysql_binary-as-hex

    也就是说,即使启用了 binary-as-hex,您也可以将二进制转换为字符串:

    mysql> SELECT FROM_BASE64(TO_BASE64("Abc")) AS result;
    +----------------+
    | result         |
    +----------------+
    | 0x416263       |
    +----------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT CONVERT(FROM_BASE64(TO_BASE64("Abc")) USING utf8mb4) AS result;
    +--------+
    | result |
    +--------+
    | Abc    |
    +--------+
    1 row in set (0.00 sec)
    

    您可能需要使用不同的字符编码。我的是 utf8mb4,但你的可能不同。

    【讨论】:

    • 谢谢你,非常简单的解决方案,我什至知道它,不知怎的,它错过了我的想法,不知道为什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多