故事
我最近在我的 MySQL 服务器上设置了复制。我沿着主 - 主复制的路线走(2台服务器,每台都是主服务器和从属服务器,如此处所述 - http://brendanschwartz.com/post/12702901390/mysql-master-master-replication)。
我开始注意到一些查询失败或在 WAMP 上使用 PhpMyAdmin 显示意外行为。例如,突然:
-- This fails
SELECT * FROM `tableName` WHERE `columnName` = 10;
-- This succeeds
SELECT * FROM tableName WHERE columnName = 10;
-- In some queries, specific columns seem to be the issue
-- So even this might work, but not always
SELECT * FROM `tableName` WHERE columnName = 10;
-- Sometimes it's even due to specific columns
-- So this might succeed
SELECT * FROM `tableName` WHERE `anotherColumnName` = 10;
我很快意识到这可能是PhpMyAdmin 的错,因为通过 MySQL shell 进行操作是有效的。然后我意识到它在我自己的基于 Linux 的机器上也可以在 PhpMyAdmin 上运行,而且 PhpMyAdmin 版本要新得多。
但是,在尝试从常规 shell 运行一些查询时,我确实遇到了反引号问题,例如:
# From my bash shell, this fails
mysql -s -uUser -pPassword -e "SELECT `columnName` FROM `dbName`.`tableName`;"
# This succeeds
mysql -s -uUser -pPassword -e "SELECT columnName FROM dbName.tableName;"
我不相信巧合,所以我想我最好检查一下发生了什么。
到目前为止我所拥有的
我在网上搜索过它,发现反引号和复制可能存在问题,因为它保存在日志中的方式(我认为)。但它仍然不能完全回答复制如何仍然为我工作,但一些查询因反引号而失败。如果有的话,我的数据支持反引号没有问题。
我知道反引号的用途 - https://dba.stackexchange.com/questions/23129/benefits-of-using-backtick-in-mysql-queries
我的 MySQL 服务器正在运行:
- Ubuntu 14.04.01(64 位服务器版)
- MySQL Ver 14.14 Distrib 5.5.41,适用于使用 readline 6.3 的 debian-linux-gnu (x86_64)
我的问题是:
- 为什么反引号不利于复制?我是否可能会遇到反引号问题,或者我的经验是否是由于深奥的、特定于平台的问题?
- 有没有推荐的方法来处理这个问题?
- 我的想法是摆脱代码中的所有反引号。我的列名都是简单的英文字母和驼峰式,所以无论如何我都不应该使用反引号。
- 我想也许我可以切换到,
sql_mode = ANSI_QUOTES
但我担心这么大的变化需要对整个系统进行彻底测试,因为我不确定它会如何影响查询的其他方面,例如值等。 - 我还认为问题可能是反引号已成为名称的一部分,但它不符合行为,我检查了。
- 我想也许我可以切换到,
我将不胜感激任何人对此问题的任何意见。