我有一个MySQL数据库,该数据库的字段TagName值为〜!@#$%^&*()_ + |} {“:?> <./'; [] \ =-` 我尝试从taginfo中选择TagName的查询,其中TagName如'%@#$%';
它显示带有标记名的数据包含引号字符。 但是我用=运算符和like运算符查询,并添加了更多的报价''以接受单引号,但结果显示为空。
我还尝试添加COLLATE UTF8_GENERAL_CI或更改CHARACTER SET,但都不能成功。
SELECT * from taginfo where tagname like '%~!@#$%^&*()_+|}{":?><./'';[]\=-`%';
SELECT * from taginfo where tagname like '%~!@#$%^&*()_+|}{":?><./'';[]\=-`%' COLLATE UTF8_GENERAL_CI;
SELECT * from taginfo where tagname COLLATE UTF8_GENERAL_CI like '%~!@#$%^&*()_+|}{":?><./'';[]\=-`%';
ALTER TABLE mytable CONVERT TO CHARACTER SET UTF8_GENERAL_CI
Error 2/19/2019 10:03:24 AM 0:00:00.039 <link> - MySQL Database Error: Unknown character set: 'UTF8_GENERAL_CI' 5 0
数据库服务器版本:MySQL 5.5.5 MariaDB 表格信息:
已更新: 我发现一个问题,如果我查询没有字符\就会显示结果:
select TagName from taginfo where TagName like '%~!@#$%^&*()_+|}{":?><./'';[]%';
但是我在最后添加了一个字符\,它什么也没显示:
select TagName from taginfo where TagName like '%~!@#$%^&*()_+|}{":?><./'';[]\%';
添加更多启动画面仍然无效
select TagName from taginfo where TagName like '%~!@#$%^&*()_+|}{":?><./'';[]\\%';
已更新: 现在的问题是,类似查询返回结果,但是=查询不返回任何结果。
SELECT * from taginfo where tagname like '%~!@#$%^&*()_+|}{":?><./'';[]\\=-`%';
select * from taginfo where TagName = '~!@#$%^&*()_+|}{":?><./'';[]\\=-`'
已更新: 当我尝试在MySQL 8.0.13中创建数据库时,此查询运行良好并返回1行
select * from taginfo1 where TagName = '~!@#$%^&*()_+|}{":?><./'';[]\\=-`';
但是在10.3.9-MariaDB中,查询
select * from taginfo1 where TagName = '~!@#$%^&*()_+|}{":?><./'';[]\\=-`';
无法返回任何结果。
SELECT VERSION();
10.3.9-MariaDB
答案 0 :(得分:0)
反斜杠是MySQL中的转义字符。您将需要对其进行两次转义,例如\\
。另外,如果使用LIKE
条件,则也必须转义百分号和下划线(否则,您会在不相关的值上进行匹配)。
您只需选择要传递的值即可查看正在发生的情况:
SELECT '%~!@#$\%^&*()_+|}{":?><./'';[]\=-`%' test1;
| test1 |
| -------------------------------- |
| %~!@#$%^&*()_+|}{":?><./';[]=-`% |
单个反斜杠就消失了。 MySQL认为它可以逃脱某些东西,但是由于后面的字符(=
)实际上不是特殊字符,因此不会再发生任何事情。
现在让我们双重逃避backslah,它确实出现在输出中:
SELECT '%~!@#$\%^&*()\_+|}{":?><./'';[]\\=-`%' test2;
| test2 |
| --------------------------------- |
| %~!@#$%^&*()_+|}{":?><./';[]\=-`% |
答案 1 :(得分:0)
我尝试设置
SET @@SQL_MODE = CONCAT(@@SQL_MODE, ',NO_BACKSLASH_ESCAPES');
并在更新查询中添加双\
SELECT * from taginfo where tagname like '%~!@#$%^&*()_+|}{":?><./'';[]\\=-`%';
此查询返回正确的结果,但不适用于=运算符。
答案 2 :(得分:0)
DROP TABLE IF EXISTS `taginfo`;
CREATE TABLE `taginfo` (
`tagname` VARCHAR(50) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
-- Notice single quote and backslash are escaped:
INSERT INTO `taginfo` (`tagname`) VALUES ('~!@#$%^&*()_+|}{":?><./'';[]\\=-`');
SELECT * FROM `taginfo` WHERE tagname = '~!@#$%^&*()_+|}{":?><./'';[]\\=-`';
-- Notice single quote, percent and underscore are escaped and backslash escaped twice
SELECT * FROM `taginfo` WHERE tagname LIKE '~!@#$\%^&*()\_+|}{":?><./'';[]\\\\=-`';
SELECT * FROM `taginfo` WHERE tagname LIKE '%~!@#$\%^&*()\_+|}{":?><./'';[]\\\\=-`%';
答案 3 :(得分:0)
最后我发现了问题,因为我设置了此模式。
SET @@SQL_MODE = CONCAT(@@SQL_MODE, ',NO_BACKSLASH_ESCAPES');
此查询返回空
select * from taginfo where tagname = '~!@#$%^&*()_+|}{":?><./'';[]\\=-`'
当我通过SET @@SQL_MODE = 'NO_ENGINE_SUBSTITUTION';
删除NO_BACKSLASH_ESCAPES时
select * from taginfo where tagname = '~!@#$%^&*()_+|}{":?><./'';[]\\=-`'
它返回带有标签名=〜!@#$%^&*()_ + |} {“:?> <./'; [] \ =-`
的行