SQL 更新字段时 phpMyAdmin 生成的语法错误

SQL syntax error generated by phpMyAdmin when updating field

我需要将一些域名更改为包含电子邮件地址(主键)的table。
我试图提取(使用 select)我需要更新的字段:

SELECT `Email`, CONCAT( 
    SUBSTRING_INDEX(`Email`, '@olddomain.', 1),
    '@newdomain.', 
    SUBSTRING_INDEX(`Email`, '@olddomain.', -1)) AS NewMail
FROM `mailaddresses` 
WHERE INSTR(`Email`,'@olddomain.')>0

这很好用,给我新旧电子邮件。
以下是返回数据的示例:

   EMail               NewMail
123@olddomain.com   123@newdomain.com
456@olddomain.com   456@newdomain.com
789@olddomain.com   789@newdomain.com

所以我尝试使用以下查询进行更新:

UPDATE `mailaddresses` 
    SET `Email` = CONCAT( 
        SUBSTRING_INDEX(`Email`, '@olddomain.', 1),
        '@newdomain.', 
        SUBSTRING_INDEX(`Email`, '@olddomain.', -1)) 
WHERE INSTR(`Email`, '@olddomain.')>0

但是 phpMyAdmin 说存在 SQL 语法错误。

1064 - 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 '1) '@newdomain.' SUBSTRING_INDEX(Email'@olddomain.', )) FROM mailaddresses WHER' at line 2

我注意到错误消息中缺少两个逗号 ',' 所以我认为 phpMyAdmin 在那里做了一些令人讨厌的事情。

编辑:
我意识到 我的 SQL 代码完全可以工作,因为我在 MySQL 控制台上对其进行了测试并且工作正常。我想我在使用 PhpMyAdmin 时遇到了问题(虽然我不知道是什么类型的问题)。

这里是我 Xampp/PhpMyAdmin 主页的一些数据:

Database server
Server: 127.0.0.1 via TCP/IP
Server type: MySQL
Server version: 5.6.24 - MySQL Community Server (GPL)
Protocol version: 10
Web server
Apache/2.4.12 (Win32) OpenSSL/1.0.1l PHP/5.6.8
Database client version: libmysql - mysqlnd 5.0.11-dev - 20120503 - $Id: 3c688b6bbc30d36af3ac34fdd4b7b5b787fe5555 $
PHP extension: mysqli
phpMyAdmin
Version information: 4.3.11

我确信这一点,因为我 运行 我的 SQL 来自 vb.net 的代码并且它有效。

所以我的问题是:
有人遇到过同样的问题吗?
我该如何解决这个问题?

您可以使用 REPLACE(str,from_str,to_str) 字符串函数来更改任何字段值的一部分...

UPDATE mailaddresses 
   SET email = REPLACE( email, '@olddomain.', '@newdomain' )
 WHERE INSTR( email, '@olddomain.' ) > 0

示例

mysql> set @olddomain = '@google.com';
Query OK, 0 rows affected (0.00 sec)

mysql> set @newdomain = '@gmail.com';
Query OK, 0 rows affected (0.00 sec)

mysql> set @email = 'rr.arepally@google.com';
Query OK, 0 rows affected (0.00 sec)

mysql> select replace( @email, @olddomain, @newdomain ) as modified_email;
+-----------------------+
| modified_email        |
+-----------------------+
| rr.arepally@gmail.com |
+-----------------------+
1 row in set (0.00 sec)

mysql>

从您的问题看来,您使用的是过时版本的 phpMyAdmin,而且当 运行 在 MySQL 控制台本身上时,同样的查询显然有效。因此,我建议您将 phpMyAdmin 更新到最新版本。写的时候是v4.5.4.1.

这里是changelogs.