您的位置:首页 > 数据库 > MySQL

mysql 常见问题整理

2017-05-02 17:59 330 查看

一 coalesce

在mysql中,其实有不少方法和函数是很有用的,这次介绍一个叫coalesce的,拼写十分麻烦,但其实作用是将返回传入的参数中第一个非null的值,比如
SELECT COALESCE(NULL, NULL, 1);
-- Return 1

SELECT COALESCE(NULL, NULL, NULL, NULL);
-- Return NULL
如果传入的参数所有都是null,则返回null

这个参数使用的场合为:假如某个字段默认是null,你想其返回的不是null,而是比如0或其他值,可以使用这个函数

SELECT COALESCE(field_name,0) as value from table;

二 mysql dump shell

#!/bin/bash

dump_sql='mysqldump -hxxx.xxx.com  -P3316 -uuser_r -ppassword db'

config_where=" --where"
config="--no-create-info --complete-insert --single-transaction --default-character-set=utf8mb4"

qadmin_user_file=qadmin_user.txt
qadmin_user_org_file=qadmin_user_org.txt
tmp1_file=tmp1.txt
tmp2_file=tmp2.txt

${dump_sql} qadmin_user ${config_where} "1 = 1" ${config} >> ./${tmp1_file}
cat ${tmp1_file} | grep 'INSERT INTO' | sed 's/),(/),\n(/g' >> ./${qadmin_user_file}

${dump_sql} qadmin_user_org ${config_where} "1 = 1" ${config} >> ./${tmp2_file}
cat ${tmp2_file} | grep 'INSERT INTO' | sed 's/),(/),\n(/g' >> ./${qadmin_user_org_file}

rm ${tmp1_file}
rm ${tmp2_file}


三. grant all privileges on

遇到了 SQLException: access denied for @'localhost' (using password: no)

解决办法 grant all privileges on *.* to joe@localhost identified by '1';

flush privileges;

拿 joe 1 登陆

MySQL> grant 权限1,权限2,…权限n on 数据库名称.表名称 to 用户名@用户地址 identified by ‘连接口令’;

权限1,权限2,…权限n代表select,insert,update,delete,create,drop,index,alter,grant,references,reload,shutdown,process,file等14个权限。
当权限1,权限2,…权限n被all privileges或者all代替,表示赋予用户全部权限。
数据库名称.表名称被*.*代替,表示赋予用户操作服务器上所有数据库所有表的权限。
用户地址可以是localhost,也可以是ip地址、机器名字、域名。也可以用’%'表示从任何地址连接。
‘连接口令’不能为空,否则创建失败。

mysql>grant select,insert,update,delete,create,drop on vtdc.employee to joe@10.163.225.87 identified by ‘123′;
给来自10.163.225.87的用户joe分配可对数据库vtdc的employee表进行select,insert,update,delete,create,drop等操作的权限,并设定口令为123。

四 mysql中不能插入中文

(1)#vim /etc/mysql/my.cnf 。(5.5以前系统)在【client】下面加入 default-character-set=utf8

在【mysqld】下面加入default-character-set=utf8

Notice:注意 如果修改后不能启动报错试试把default-character-set=utf8改为character_set_server=utf8,仅仅加入到mysqld下面的.client就不需要加了

(2)#vim /etc/mysql/my.cnf 。(5.5以后系统)如下修改:

[client]
default-character-set=utf8

[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci

五、重启mysql(/etc/init.d/mysql stop /etc/init.d/mysql start) service mysql restart

六、修成成功,进入mysql查看字符集(mysql>show variables like ‘character_set_%’;)

五 mybatis中的 ${} 和 #{} 有什么区别

动态sql时mybatis的强大特性之一,也是它优于其他orm框架的一个重要原因。mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理的。在动态sql解析阶段, #{}和${} 会有不同的表现

(1) #{}

select * from user where name = #{name};


#{} 在动态解析的时候, 会解析成一个参数标记符。就是解析之后的语句是:

select * from user where name = ?;


(2) ${}

select * from user where name = ${name};


${}在动态解析的时候,会将我们传入的参数当做String字符串填充到我们的语句中,就会变成下面的语句

select * from user where name = "zhangsan";


预编译之前的 SQL 语句已经不包含变量了,完全已经是常量数据了。相当于我们普通没有变量的sql了。

综上${} 变量的替换阶段实在动态sql解析阶段,而#{} 变量的替换是在dbms中,#方式能够很大程度防止sql注入,一般而言能用#就别用$
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: