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.
我需要将一些域名更改为包含电子邮件地址(主键)的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(
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.