mysql-如何使用\(反斜杠)处理查询搜索?
mysql-How to handle query search with \(backslash)?
我在 mysql table 中插入了一个列 backslash(\)
就像 user345
一样。但是当我在 table 值中看到我没有看到forward slash(\)
。我刚看到 user12345。
当我使用以下可能的方式查询 backslash(\)
刚刚插入的行时,我总是得到零记录。
select * from users where user='user12345'
select * from users where user='user345'
select * from users where user='user\12345'
当我将列值复制粘贴到记事本+时,我可以看到每个列值的末尾都有一个回车符。 user12345CRLF,截至目前我无法 update/remove 马车 return。但我想用回车 return 获取记录。我该怎么做?
我不想使用 like 查询,我想查询确切的用户名。我该怎么做?
反斜杠字符\用于转义序列。当您插入 'user345' 之类的值时,默认情况下 mysql 服务器将其视为“\1”作为转义字符,但它不是任何特殊字符,因此它会从字符串中丢弃 \。
Hitesh> update test set fname='user4';
Query OK, 2 rows affected (0.06 sec)
Rows matched: 2 Changed: 2 Warnings: 0
Hitesh> select fname from test;
+---------+
| fname |
+---------+
| user344 |
| user344 |
+---------+
2 rows in set (0.00 sec)
如果你想在字符串中存储 \ 那么你应该使用 \
Hitesh> update test set fname='user\344';
Query OK, 2 rows affected (0.03 sec)
Rows matched: 2 Changed: 2 Warnings: 0
Hitesh> select fname from test;
+----------+
| fname |
+----------+
| user4 |
| user4 |
+----------+
2 rows in set (0.00 sec)
如果您不想将 \ 设置为转义字符,那么您可以启用 sql 模式 NO_BACKSLASH_ESCAPES。
Hitesh> SET sql_mode = 'NO_BACKSLASH_ESCAPES';
Query OK, 0 rows affected (0.00 sec)
Hitesh> update test set fname='user4';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 2 Changed: 0 Warnings: 0
Hitesh> select fname from test;
+----------+
| fname |
+----------+
| user4 |
| user4 |
+----------+
2 rows in set (0.00 sec)
对于回车 return 到列末尾的情况,在查询中可以在 where 子句中找到以 \r 结尾的字符串,并且 select 列可以跳过最后一个字符 \ r
Hitesh> set @@sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected (0.00 sec)
Hitesh> update test set fname='user344\r';
Query OK, 2 rows affected (0.17 sec)
Rows matched: 2 Changed: 2 Warnings: 0
Hitesh> select left( fname, CHAR_LENGTH(fname)-1) as fname from test where fname like '%\r';
+---------+
| fname |
+---------+
| user344 |
| user344 |
+---------+
2 rows in set (0.00 sec)
再次感谢@Hitesh、@Barmar。我想出了精确匹配搜索的查询。 select * from users where user='user12345\r'
我在 mysql table 中插入了一个列 backslash(\)
就像 user345
一样。但是当我在 table 值中看到我没有看到forward slash(\)
。我刚看到 user12345。
当我使用以下可能的方式查询 backslash(\)
刚刚插入的行时,我总是得到零记录。
select * from users where user='user12345'
select * from users where user='user345'
select * from users where user='user\12345'
当我将列值复制粘贴到记事本+时,我可以看到每个列值的末尾都有一个回车符。 user12345CRLF,截至目前我无法 update/remove 马车 return。但我想用回车 return 获取记录。我该怎么做?
我不想使用 like 查询,我想查询确切的用户名。我该怎么做?
反斜杠字符\用于转义序列。当您插入 'user345' 之类的值时,默认情况下 mysql 服务器将其视为“\1”作为转义字符,但它不是任何特殊字符,因此它会从字符串中丢弃 \。
Hitesh> update test set fname='user4';
Query OK, 2 rows affected (0.06 sec)
Rows matched: 2 Changed: 2 Warnings: 0
Hitesh> select fname from test;
+---------+
| fname |
+---------+
| user344 |
| user344 |
+---------+
2 rows in set (0.00 sec)
如果你想在字符串中存储 \ 那么你应该使用 \
Hitesh> update test set fname='user\344';
Query OK, 2 rows affected (0.03 sec)
Rows matched: 2 Changed: 2 Warnings: 0
Hitesh> select fname from test;
+----------+
| fname |
+----------+
| user4 |
| user4 |
+----------+
2 rows in set (0.00 sec)
如果您不想将 \ 设置为转义字符,那么您可以启用 sql 模式 NO_BACKSLASH_ESCAPES。
Hitesh> SET sql_mode = 'NO_BACKSLASH_ESCAPES';
Query OK, 0 rows affected (0.00 sec)
Hitesh> update test set fname='user4';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 2 Changed: 0 Warnings: 0
Hitesh> select fname from test;
+----------+
| fname |
+----------+
| user4 |
| user4 |
+----------+
2 rows in set (0.00 sec)
对于回车 return 到列末尾的情况,在查询中可以在 where 子句中找到以 \r 结尾的字符串,并且 select 列可以跳过最后一个字符 \ r
Hitesh> set @@sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected (0.00 sec)
Hitesh> update test set fname='user344\r';
Query OK, 2 rows affected (0.17 sec)
Rows matched: 2 Changed: 2 Warnings: 0
Hitesh> select left( fname, CHAR_LENGTH(fname)-1) as fname from test where fname like '%\r';
+---------+
| fname |
+---------+
| user344 |
| user344 |
+---------+
2 rows in set (0.00 sec)
再次感谢@Hitesh、@Barmar。我想出了精确匹配搜索的查询。 select * from users where user='user12345\r'