MySQL服务器版本10.3.9-MariaDB无法查询文本有单引号
MySQL server version 10.3.9-MariaDB can not query text has single quote
我有一个 MySQL 数据库,其中包含一个值为 ~!@#$%^&*()_+|}{":?><./';[]\= 的已归档标记名-`
我尝试查询 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
Table信息:
下面是没有单引号的查询结果:
更新:
我发现一个问题,如果我查询没有字符 \ 它显示结果:
select TagName from taginfo where TagName like '%~!@#$%^&*()_+|}{":?><./'';[]%';
但是我在末尾加了一个字符\它没有显示任何内容:
select TagName from taginfo where TagName like '%~!@#$%^&*()_+|}{":?><./'';[]\%';
添加更多启动画面仍然无效
select TagName from taginfo where TagName like '%~!@#$%^&*()_+|}{":?><./'';[]\%';
更新:
现在的问题是,like query return result 但 = query not return any.
SELECT * from taginfo where tagname like '%~!@#$%^&*()_+|}{":?><./'';[]\=-`%';
select * from taginfo where TagName = '~!@#$%^&*()_+|}{":?><./'';[]\=-`'
更新:
当我尝试在 MySQL 8.0.13 中创建数据库时,此查询运行良好并且 return 1 行
select * from taginfo1 where TagName = '~!@#$%^&*()_+|}{":?><./'';[]\=-`';
但是在 10.3.9-MariaDB 中,查询
select * from taginfo1 where TagName = '~!@#$%^&*()_+|}{":?><./'';[]\=-`';
无法return任何结果。
SELECT VERSION();
10.3.9-MariaDB
反斜杠是 MySQL 中的转义字符。你需要对它进行双重转义,比如 \
。此外,如果使用 LIKE
条件,百分号和下划线也需要转义(否则您会匹配不相关的值)。
您可以通过简单地选择您传递的值来查看发生了什么:
SELECT '%~!@#$\%^&*()_+|}{":?><./'';[]\=-`%' test1;
| test1 |
| -------------------------------- |
| %~!@#$%^&*()_+|}{":?><./';[]=-`% |
单个反斜杠消失了。 MySQL 认为它是为了逃避某些东西,但由于后面的字符 (=
) 实际上不是特殊字符,所以没有更多的事情发生。
现在让我们双重转义反斜杠,它确实出现在输出中:
SELECT '%~!@#$\%^&*()\_+|}{":?><./'';[]\=-`%' test2;
| test2 |
| --------------------------------- |
| %~!@#$%^&*()_+|}{":?><./';[]\=-`% |
我尝试设置
SET @@SQL_MODE = CONCAT(@@SQL_MODE, ',NO_BACKSLASH_ESCAPES');
并更新查询添加双\
SELECT * from taginfo where tagname like '%~!@#$%^&*()_+|}{":?><./'';[]\=-`%';
此查询 return 正确结果但不适用于 = 运算符。
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 '%~!@#$\%^&*()\_+|}{":?><./'';[]\\=-`%';
最后我发现了问题,因为我设置了这个模式。
SET @@SQL_MODE = CONCAT(@@SQL_MODE, ',NO_BACKSLASH_ESCAPES');
并且此查询 return 为空
select * from taginfo where tagname = '~!@#$%^&*()_+|}{":?><./'';[]\=-`'
当我通过 SET @@SQL_MODE = 'NO_ENGINE_SUBSTITUTION';
删除 NO_BACKSLASH_ESCAPES 时
select * from taginfo where tagname = '~!@#$%^&*()_+|}{":?><./'';[]\=-`'
它的 return 行标记名 = ~!@#$%^&*()_+|}{":?><./';[]\=-`
我有一个 MySQL 数据库,其中包含一个值为 ~!@#$%^&*()_+|}{":?><./';[]\= 的已归档标记名-` 我尝试查询 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
Table信息:
下面是没有单引号的查询结果:
更新: 我发现一个问题,如果我查询没有字符 \ 它显示结果:
select TagName from taginfo where TagName like '%~!@#$%^&*()_+|}{":?><./'';[]%';
但是我在末尾加了一个字符\它没有显示任何内容:
select TagName from taginfo where TagName like '%~!@#$%^&*()_+|}{":?><./'';[]\%';
添加更多启动画面仍然无效
select TagName from taginfo where TagName like '%~!@#$%^&*()_+|}{":?><./'';[]\%';
更新: 现在的问题是,like query return result 但 = query not return any.
SELECT * from taginfo where tagname like '%~!@#$%^&*()_+|}{":?><./'';[]\=-`%';
select * from taginfo where TagName = '~!@#$%^&*()_+|}{":?><./'';[]\=-`'
更新: 当我尝试在 MySQL 8.0.13 中创建数据库时,此查询运行良好并且 return 1 行
select * from taginfo1 where TagName = '~!@#$%^&*()_+|}{":?><./'';[]\=-`';
但是在 10.3.9-MariaDB 中,查询
select * from taginfo1 where TagName = '~!@#$%^&*()_+|}{":?><./'';[]\=-`';
无法return任何结果。
SELECT VERSION();
10.3.9-MariaDB
反斜杠是 MySQL 中的转义字符。你需要对它进行双重转义,比如 \
。此外,如果使用 LIKE
条件,百分号和下划线也需要转义(否则您会匹配不相关的值)。
您可以通过简单地选择您传递的值来查看发生了什么:
SELECT '%~!@#$\%^&*()_+|}{":?><./'';[]\=-`%' test1;
| test1 |
| -------------------------------- |
| %~!@#$%^&*()_+|}{":?><./';[]=-`% |
单个反斜杠消失了。 MySQL 认为它是为了逃避某些东西,但由于后面的字符 (=
) 实际上不是特殊字符,所以没有更多的事情发生。
现在让我们双重转义反斜杠,它确实出现在输出中:
SELECT '%~!@#$\%^&*()\_+|}{":?><./'';[]\=-`%' test2;
| test2 |
| --------------------------------- |
| %~!@#$%^&*()_+|}{":?><./';[]\=-`% |
我尝试设置
SET @@SQL_MODE = CONCAT(@@SQL_MODE, ',NO_BACKSLASH_ESCAPES');
并更新查询添加双\
SELECT * from taginfo where tagname like '%~!@#$%^&*()_+|}{":?><./'';[]\=-`%';
此查询 return 正确结果但不适用于 = 运算符。
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 '%~!@#$\%^&*()\_+|}{":?><./'';[]\\=-`%';
最后我发现了问题,因为我设置了这个模式。
SET @@SQL_MODE = CONCAT(@@SQL_MODE, ',NO_BACKSLASH_ESCAPES');
并且此查询 return 为空
select * from taginfo where tagname = '~!@#$%^&*()_+|}{":?><./'';[]\=-`'
当我通过 SET @@SQL_MODE = 'NO_ENGINE_SUBSTITUTION';
select * from taginfo where tagname = '~!@#$%^&*()_+|}{":?><./'';[]\=-`'
它的 return 行标记名 = ~!@#$%^&*()_+|}{":?><./';[]\=-`