碰到grant的问题,发现这篇文章,做个转载:
原文地址:http://blog.useasp.net/archive/2013/05/21/MySQL-special-character-escape-method-when-grant-privilages-to-user.aspx
在MySQL中使用了下划线的数据库名,今天在GRANT的时候,死活无法为用户赋予权限,一直报错。查看了官方的文档,文档中说:如果使用下划线的数据库在使用GRANT的时候,需要对数据库的下划线进行转义。
官方文档的全文如下:
1
2
3
4
5
6
7
8
|
The “_” and “%” wildcards are permitted when specifying database names in GRANT statements that grant privileges at the global or database levels. This means, for example, that if you want to use a “_” character as part of a database name, you should specify it as “\_” in the GRANT statement, to prevent the user from being able to access additional databases matching the wildcard pattern; for example, GRANT ... ON `foo\_bar`.* TO .... |
GRANT语句用于在全局层级或数据库层级赋予权限。当在GRANT语句中指定数据库名称时,允许使用‘_’和‘%’通配符。这意味着,如果您想要使用‘_’字符作为一个数据库名称的一部分,您应该在GRANT语句中指定它为‘\_’,以防止用户可以访问其它符合此通配符格式的数据库;例如,GRANT ... ON `foo\_bar`.* TO ...。
说明非常明确,就是在碰到下划线和百分号的时候,为了防止GRANT的时候权限漂移,需要明确的对这两个通配符进行转义,转义符为\,因此有了如下的语句:
1
|
GRANT ALL ON 'db\_test' .* TO 'test_user' ;
|
恩,看上去是如此的完美,但,非常遗憾的是,MySQL接受到这个语句直接报错:
1
2
|
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near '' db\_test '.* TO ' test_user '' at line 1
|
经过多次测试,终于发现这个语法应该变成:
1
|
GRANT ALL ON `db\_test`.* TO 'test_user' ;
|
发现不同了吗?至少我当时没有发现,经过尝试才发现,转义的时候,不仅原有的通配符需要反斜杆[\]进行转义,就连包含转义字串的引号也要变成反勾号!反勾号是啥?就是标准键盘中主键盘数字键1前面的那个键(也就是ESC下面的那个键)。
经过修正后的SQL语句非常顺利的执行了,类似的情况,在GRANT中需要注意的是TO后面的User,平时User字串是可以不用单引号的,但如果User字串中包含了中划线(-)的时候,或者含有通配符(%)的时候,则必须要有引号包含。
注,jdbc的url 中同样需要转义:
url=jdbc:mysql://127.0.0.1:3306/db\_dev?useUnicode=true&characterEncoding=utf-8
相关推荐
#### 字符串处理与特殊字符转义 - 使用`'`或`\g`来转义字符串中的特殊字符,避免语法错误。 #### 时间日期函数 - `SELECT NOW();`: 获取当前系统时间。 - `SELECT USER();`: 获取当前登录的用户名。 - `SELECT ...
- 测试Web表单输入中的特殊字符(如单引号和双引号),确保程序能够正确处理这些输入并返回预期结果。 - 修改URL参数中的特殊字符(如`%22`、`%23`和`%27`),以防止潜在的安全漏洞。 - 验证数字字段变量的有效性...
2. 特殊字符:如\.、\d、\w、\s等,它们代表特定的字符或字符集。 3. 重复和选择:*、+、?表示重复次数,|表示选择。 4. 查找和替换:在字符串中查找匹配的模式,并可进行替换操作。 5. 非贪婪匹配:?用于限制...
在SQL语句中,需要注意特殊字符如单引号`'`和反斜杠`\`的转义,以避免语法错误。 #### 十一、查询当前时间 使用`SELECT NOW();`可以查询当前的时间戳,这对于记录操作时间和事件审计很有帮助。 #### 十二、查询...
4.6.9 特殊字符一览 4.6.10 在智能表单中应用 4.7 用正则表达式查找子字符串 4.8 使用正则表达式分割字符串 4.9 比较字符串函数和正则表达式函数 4.10 进一步学习 4.11 下一章 第5章 代码重用与函数编写 ...
采取措施防止SQL注入攻击,如使用参数化查询、转义特殊字符、限制用户输入,避免将用户输入直接拼接到SQL语句中。 #### 10. 最小化MySQL服务暴露 在部署MySQL时,减少其在网络上的可见度,例如放置在DMZ(非军事区...
当SQL语句中出现特殊字符时,需用单引号(')或反斜杠(\)进行转义。 #### 12. 当前时间查询 ```sql SELECT NOW(); ``` 返回系统当前日期和时间。 #### 13. 当前登录用户查询 ```sql SELECT USER(); ``` 显示当前连接...
- **预防措施** 包括使用参数化查询、转义特殊字符等。 5. **什么是视图(View)?在业务中通常用它来做什么?** - **视图** 是基于SQL查询的结果集的虚拟表。 - **用途** 包括简化复杂查询、保护数据等。 6. *...
4.6.8 匹配特殊字符 4.6.9 特殊字符一览 4.6.10 在智能表单中应用 4.7 用正则表达式查找子字符串 4.8 使用正则表达式分割字符串 4.9 比较字符串函数和正则表达式函数 4.10 进一步学习 4.11 下一章 第5章 代码重用与...
4.6.9 特殊字符一览 4.6.10 在智能表单中应用 4.7 用正则表达式查找子字符串 4.8 使用正则表达式分割字符串 4.9 比较字符串函数和正则表达式函数 4.10 进一步学习 4.11 下一章 第5章 代码重用与函数编写 ...
- 特殊比较运算符如`BETWEEN`用于指定范围,`IN`用于检查值是否在给定列表内,`LIKE`则支持模糊匹配,配合`%`和`_`通配符使用,还可以通过`ESCAPE`来定义转义字符。 在实际操作中,应尽量避免录入`NULL`值,并合理...
这两个函数都可以对特殊字符进行转义,但`mysql_escape_string()`在PHP 7中已被弃用,推荐使用`addslashes()`或预处理语句。 4. **获取客户端IP与服务器IP**:通过`$_SERVER['REMOTE_ADDR']`可以获取客户端的IP地址...
2. **过滤和转义输出**:在显示用户数据时,应使用htmlspecialchars等函数对HTML特殊字符进行转义,防止跨站脚本(XSS)攻击。 3. **错误处理**:避免在页面上直接显示错误信息,以免泄露系统内部信息。可以设置PHP...
- 启用或配置好`mysql_real_escape_string()`等函数来转义特殊字符。 6. **解决跨表查询效率问题** - 尽可能减少跨表查询的使用。 - 如果必须进行跨表查询,则应确保所有关联的字段都有索引。 - 使用EXPLAIN...
- 特殊字符处理:`ESCAPE`用于转义字符,如`WHERE ENAME LIKE 'A\_%' ESCAPE '\';` ##### 2.4 排序 - 正序排序:`ORDER BY ENAME;` - 倒序排序:`ORDER BY SAL DESC;` - 多字段排序:`ORDER BY DEPTNO, SAL DESC;...
在SQL(Structured Query Language)中,保留字是预定义并具有特殊含义的词汇,它们用于...在JavaScript中直接处理SQL字符串可能导致XSS(跨站脚本攻击)或其他安全风险,因此要确保对用户输入进行适当的验证和转义。