MySQL PhpMyAdmin - 无法识别的关键字 CONCAT

Posted

技术标签:

【中文标题】MySQL PhpMyAdmin - 无法识别的关键字 CONCAT【英文标题】:MySQL PhpMyAdmin - Unrecognized Keyword CONCAT 【发布时间】:2017-04-06 06:56:36 【问题描述】:

我正在练习使用 phpMyAdmin 在 mysql 中创建密码哈希表。我尝试输入的 SQL 代码是:

编辑:使用我正在使用的新代码:

INSERT INTO `user` (`username`, `salt`, `passwordhash`) 
VALUES ('username', 'a1b2c3d4e5f6g', SHA2(CONCAT('password', 'a1b2c3d4e5f6g'), 256)));

在 SHA2 之后,一切都是错误的,第一个错误是“无法识别的关键字。(靠近 CONCAT)”。其余的都说“无法识别的令牌”,然后是任何字符串,所以看起来所有这些问题都是由 CONCAT 引起的。有没有其他方法可以连接字符串?

【问题讨论】:

你不应该使用 SHA1 password hashesMD5 password hashes 而你真的应该使用 PHP 的built-in functions 来处理密码安全。确保你 don't escape passwords 或在散列之前对它们使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。 您使用的是哪个 phpMyAdmin 和 MySQL 版本?一旦我更正了额外的右括号,这对我使用当前的 phpMyAdmin 版本(4.6.5.2)来说很好。 另外,您可以使用“插入”选项卡,其中包含可能对您有所帮助的 MySQL 函数下拉列表。 【参考方案1】:

你应该有

查询中的错误 (1582):对本机的调用中的参数计数不正确 函数'SHA2'

这样对我有用

CREATE TABLE `user` (
  `username` varchar(255) NOT NULL,
  `salt` varchar(255) NOT NULL,
  `passwordhash` varchar(255) NOT NULL
) ENGINE='InnoDB' COLLATE 'utf16_bin';

INSERT INTO `user` (`username`, `salt`, `passwordhash`) 
VALUES ('username', 'a1b2c3d4e5f6g', SHA2('test',CONCAT('password', 'a1b2c3d4e5f6g')));

SELECT * FROM user;


username    salt    passwordhash
username    a1b2c3d4e5f6g   9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
username    a1b2c3d4e5f6g   9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

【讨论】:

感谢您的帮助。看起来问题确实出在 CONCAT 之类的东西上。它说 Unrecognized Keyword 及其下游的所有内容都是错误的。它还说明了第 99 位的右括号? (请参阅屏幕截图)。我已经尝试了该线程中所有建议的所有语法组合,但没有任何效果:/【参考方案2】:

根据您的新代码:您有一个额外的括号,同样位于 , 256)));

这里:

INSERT INTO `user` (`username`, `salt`, `passwordhash`) 
VALUES ('username', 'a1b2c3d4e5f6g', SHA2(CONCAT('password', 'a1b2c3d4e5f6g'), 256));

这个和我留在上面的所有 cmets。


编辑:根据SHA2() 上的 MySQL 手册,以下内容可能是一个相关问题。

根据https://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#function_sha2

此功能仅在 MySQL 已配置 SSL 支持时有效。见Section 6.4, “Using Secure Connections”。 SHA2() 可以被认为在密码学上比 MD5() 或 SHA1() 更安全。 SHA2() 已在 MySQL 5.5.5 中添加。

因此,请确保您使用的 MySQL 版本与其匹配或更高。如果它低于 5.5.5,则 SHA2() 不可供您使用。那,或者它可能是服务器上的系统管理员/安全问题。

联系你学校的系统管理员,如果你是从那里运行这个的,就像你在 cmets 中所说的那样 - “我正在关注一个说使用 SHA2 的学校教程”。无论哪种方式,这里的 MySQL 版本都很重要。

要检查安装的 MySQL 版本,请在 phpmyadmin 中使用以下语法:

显示变量,例如“%version%”;

而不是您使用的 SELECT VERSION();

【讨论】:

这实际上不是原因。感谢您的帮助,但我复制并粘贴了每个人的不同答案,并尝试了任何可能有帮助的随机修复。你为我做了很多,而且显然知识渊博得多,但是当它不起作用时,请不要再告诉我接受你的答案。我可以诚实地理解您是否觉得这是在浪费您的时间,因为它最终可能会成为缓存问题(就像您上面所说的那样)。我要尝试重新登录。不过,真诚地感谢您的宝贵时间。 @NicholasHassan 我已经编辑了我的评论,你是对的。 @NicholasHassan 我不介意花时间提供帮助。我只是觉得很奇怪为什么你的 phpmyadmin 表现得如此奇怪。确保您的列类型和长度也正确。 登录退出重启后还是不行。我今天有一个教程,希望有人可以直接看我的电脑会更好。感谢您的所有帮助 - 我敢肯定,即使它们不是主要问题,我所有的语法错误也会在以后造成麻烦。 为什么这被否决了?如果您因为觉得这是错误的而要对此投反对票,那么也对其他人投反对票。解释反对意见。【参考方案3】:

根据 MySQL 文档:

SHA2(str, hash_length)

计算 SHA-2 系列哈希函数(SHA-224、SHA-256、SHA-384 和 SHA-512)。第一个参数是要散列的明文字符串。第二个参数表示结果所需的位长度,其值必须为 224、256、384、512 或 0(相当于 256)。如果任一参数为 NULL 或哈希长度不是允许值之一,则返回值为 NULL。否则,函数结果是包含所需位数的哈希值。请参阅本节开头关于高效存储哈希值的说明

您需要为SHA2() 函数提供第二个参数(哈希长度),此参数必须是值 224、256、384、512 或 0 之一。

INSERT INTO `user` (`username`, `salt`, `passwordhash`) VALUES ('username', 'a1b2c3d4e5f6g', SHA2(CONCAT('password', 'a1b2c3d4e5f6g'),256));

【讨论】:

Didn't I already say that? “是的,你做到了,那又怎样?” 你为什么要这么流氓? OP告诉我这没有什么不同。我希望这能让你回过神来,如果你想恢复态度的话。 哇,保持冷静,伙计,我不是故意要伤害你的……事实上,这是他查询的唯一问题…… 感谢您的帮助。看起来问题确实出在 CONCAT 之类的东西上。它说 Unrecognized Keyword 及其下游的所有内容都是错误的。它还说明了第 99 位的右括号? (请参阅屏幕截图)。我已经尝试了该线程中所有建议的所有语法组合,但没有任何效果:/ 如果我伤害了你,我很抱歉,请原谅。只是我没明白你说的“我不是已经说过了吗?”是什么意思。 @Fred-ii-

以上是关于MySQL PhpMyAdmin - 无法识别的关键字 CONCAT的主要内容,如果未能解决你的问题,请参考以下文章

MySQL phpmyadmin - SELECT FOR UPDATE 无法识别

g++:错误:无法识别的命令行选项“-mt”

如何解决mysql中读取含表情符号的内容无法识别的问题

导入 PHP MySql 数据库

Swift无法识别的选择器发送到实例错误

导入mysql数据库出错