我在backslash(\)
user\12345
中插入了一个列在mysql表中。但是当我在表中看到值时,我没有看到forward slash(\)
。我刚看到 user12345 。
当我使用以下可能的方式查询刚插入的backslash(\)
行时,我总是得到零记录。
select * from users where user='user12345'
select * from users where user='user\12345'
select * from users where user='user\\12345'
当我复制将列值粘贴到记事本中时+我可以看到每个列值的末尾都有一个回车符。 user12345CRLF,截至目前我无法更新/删除回车。但我想用回车来获取记录。我怎么能这样做?
我不想使用类似的查询,我想查询确切的用户名。我怎么能这样做?
答案 0 :(得分:0)
反斜杠字符\用于转义序列。当您插入像'user \ 12345'这样的值时,默认情况下mysql服务器将其作为'\ 1'作为转义字符,但它不是任何特殊字符,因此它会从字符串中丢弃\。
Hitesh> update test set fname='user\344';
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 |
+----------+
| user\344 |
| user\344 |
+----------+
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='user\344';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 2 Changed: 0 Warnings: 0
Hitesh> select fname from test;
+----------+
| fname |
+----------+
| user\344 |
| user\344 |
+----------+
2 rows in set (0.00 sec)
对于回车到列结尾的情况,在查询中你可以找到以\ r在where子句中结束的字符串并选择列你可以跳过最后一个字符\ 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)
答案 1 :(得分:0)
再次感谢@ Hitesh,@ Barmar。我想出了完全匹配搜索的查询。 select * from users where user='user12345\r'