就像mysql中的特殊字符一样\

就像mysql中的特殊字符一样\,mysql,Mysql,我的查询是从PMT\U项目中选择*,其中项目代码为“%A3\7\2011%”,公司ID=14。PROJECT_CODE列包含精确匹配的记录,但我的上述查询无法从MySql数据库中获取该记录。如果上面的查询有错误,请纠正我关于\特殊字符的语法,或者建议我如何获取上面的记录。反斜杠在mysql中很困难。我刚刚直接从mysql客户端运行了一个测试,发现要添加字段,只需执行一次转义(两个反斜杠): 但是使用LIKE命令,转义需要按字面意思表示,因此需要对语句进行双重转义(四个反斜杠): 再加上应用层所需

我的查询是从PMT\U项目中选择*,其中项目代码为“%A3\7\2011%”,公司ID=14。PROJECT_CODE列包含精确匹配的记录,但我的上述查询无法从MySql数据库中获取该记录。如果上面的查询有错误,请纠正我关于
\
特殊字符的语法,或者建议我如何获取上面的记录。

反斜杠在mysql中很困难。我刚刚直接从mysql客户端运行了一个测试,发现要添加字段,只需执行一次转义(两个反斜杠):

但是使用
LIKE
命令,转义需要按字面意思表示,因此需要对语句进行双重转义(四个反斜杠):

再加上应用层所需的转义,它可能会变得相当混乱。另一种方法是使用单字符通配符:

SELECT * FROM mytable WHERE field1 LIKE '%A3_7_2011%';
另一种选择是使用“无反斜杠转义”模式:

SET SESSION sql_mode='NO_BACKSLASH_ESCAPES';
SELECT * FROM mytable WHERE field1 LIKE '%A3\7\2011%';
编辑(谢谢,lucek):

或者,要保留当前sql_模式,请执行以下操作:

SET @temp_sql_mode = @@SESSION.sql_mode;
SET SESSION sql_mode = CONCAT_WS(',', @@SESSION.sql_mode, 'NO_BACKSLASH_ESCAPES');
-- YOUR_SELECT_GOES_HERE;
SET SESSION sql_mode = @temp_sql_mode;

反斜杠是MySQL中的标准转义字符。如果要按字面意思使用反斜杠字符,则必须为此查询定义另一个转义字符:

SELECT *
FROM PMT_PROJECT
WHERE PROJECT_CODE LIKE '%A3\7\2011%' ESCAPE '|' AND COMPANY_ID=14

我的查询的可能重复没有给出任何错误,它无法获取记录,假设我更改了上述内容,如%A3/7/2011%',如果数据库中存在记录,则它将在执行此设置会话sql_mode='NO_BACKSLASH_ESCAPES'后获取记录;如何按原样设置会话sql_模式默认值。只需执行
设置会话sql_模式=“”
@DougKress实际上,如果在sql_模式下设置了多个标志,就会把事情搞砸。正确的方法是:设置(at)temp_sql_mode=(at)(at)SESSION.sql_mode;设置SESSION sql_mode=CONCAT_WS(',',(at)(at)SESSION.sql_mode,“无反斜杠转义”);你的选择在这里;设置会话sql_模式=(at)临时sql_模式;我试图找到“逃离‘角色’”的文档,但什么也没找到。你能给我指一下描述了ESCAPE的MySQL文档吗?
SET @temp_sql_mode = @@SESSION.sql_mode;
SET SESSION sql_mode = CONCAT_WS(',', @@SESSION.sql_mode, 'NO_BACKSLASH_ESCAPES');
-- YOUR_SELECT_GOES_HERE;
SET SESSION sql_mode = @temp_sql_mode;
SELECT *
FROM PMT_PROJECT
WHERE PROJECT_CODE LIKE '%A3\7\2011%' ESCAPE '|' AND COMPANY_ID=14