MySQL服务器版本10.3.9-MariaDB无法查询具有单引号的文本

时间:2019-02-19 01:14:06

标签: mysql sql mariadb toad mariasql

我有一个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 表格信息:enter image description here

这是没有单引号的结果查询: enter image description here

已更新: 我发现一个问题,如果我查询没有字符\就会显示结果:

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

4 个答案:

答案 0 :(得分:0)

反斜杠是MySQL中的转义字符。您将需要对其进行两次转义,例如\\。另外,如果使用LIKE条件,则也必须转义百分号和下划线(否则,您会在不相关的值上进行匹配)。

您只需选择要传递的值即可查看正在发生的情况:

SELECT '%~!@#$\%^&*()_+|}{":?><./'';[]\=-`%' test1;

| test1                            |
| -------------------------------- |
| %~!@#$%^&*()_+|}{":?><./';[]=-`% |

单个反斜杠就消失了。 MySQL认为它可以逃脱某些东西,但是由于后面的字符(=)实际上不是特殊字符,因此不会再发生任何事情。

现在让我们双重逃避backslah,它确实出现在输出中:

SELECT '%~!@#$\%^&*()\_+|}{":?><./'';[]\\=-`%' test2;

| test2                             |
| --------------------------------- |
| %~!@#$%^&*()_+|}{":?><./';[]\=-`% |

View on DB Fiddle

答案 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 = '~!@#$%^&*()_+|}{":?><./'';[]\\=-`'

它返回带有标签名=〜!@#$%^&*()_ + |} {“:?> <./'; [] \ =-`

的行