1

我有一个 MySQL 数据库,它的归档 TagName 值为 ~!@#$%^&*()_+|}{":?><./';[]\=-` 我尝试查询 select TagName from taginfo where TagName like '%@#$%';

它显示带有标记名的数据包含引号字符。但我用 = 运算符和 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 '%~!@#$%^&*()_+|}{":?><./'';[]\\%';

更新:现在的问题,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

4 回答 4

1

最后我发现了问题,因为我设置了这个模式。

SET @@SQL_MODE = CONCAT(@@SQL_MODE, ',NO_BACKSLASH_ESCAPES');

这个查询返回空

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

当我删除 NO_BACKSLASH_ESCAPES 时SET @@SQL_MODE = 'NO_ENGINE_SUBSTITUTION';

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

它返回标记名 = ~!@#$%^&*()_+|}{":?><./';[]\=-` 的行

于 2019-03-12T06:34:52.873 回答
0

反斜杠是 MySQL 中的转义字符。您需要双重转义它,例如\\. 此外,如果使用LIKE条件,百分号和下划线也需要转义(否则您可能会匹配不相关的值)。

您可以通过简单地选择您传递的值来查看正在发生的事情:

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

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

单个反斜杠就消失了。MySQL 认为它是为了逃避某些东西,但由于后面的字符 ( =) 实际上不是特殊字符,所以什么也没有发生。

现在让我们双重转义反斜杠,它确实出现在输出中:

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

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

在 DB Fiddle 上查看

于 2019-02-19T01:35:36.970 回答
0

我尝试设置

SET @@SQL_MODE = CONCAT(@@SQL_MODE, ',NO_BACKSLASH_ESCAPES');

并更新查询添加双\

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

此查询返回正确的结果,但不适用于 = 运算符。

于 2019-02-19T01:37:22.087 回答
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 '%~!@#$\%^&*()\_+|}{":?><./'';[]\\\\=-`%';
于 2019-02-19T01:38:41.023 回答