【数据库 第三天】
一、 MySQL 的常用函数
1.字符串函数
(1)字符串函数列表概览
函数 | 用法 |
---|---|
CONCAT(S1,S2,…,Sn) | 连接 S1,S2,…,Sn 为一个字符串 |
CONCAT_WS(separator, S1,S2,…,Sn) | 连接 S1 一直到 Sn,并且中间以 separator 作为分隔符 |
CHAR_LENGTH(s) | 返回字符串 s 的字符数 |
LENGTH(s) | 返回字符串 s 的字节数,和字符集有关 |
INSERT(str, index , len, instr) | 将字符串 str 从第 index 位置开始,len 个字符长的子串替换为字符串 instr |
UPPER(s) 或 UCASE(s) | 将字符串 s 的所有字母转成大写字母 |
LOWER(s) 或LCASE(s) | 将字符串 s 的所有字母转成小写字母 |
LEFT(s,n) | 返回字符串 s 最左边的 n 个字符 |
RIGHT(s,n) | 返回字符串 s 最右边的 n 个字符 |
LPAD(str, len, pad) | 用字符串 pad 对 str 最左边进行填充,直到 str 的长度为 len 个字符 |
RPAD(str ,len, pad) | 用字符串 pad 对 str 最右边进行填充,直到 str 的长度为 len 个字符 |
LTRIM(s) | 去掉字符串 s 左侧的空格 |
RTRIM(s) | 去掉字符串 s 右侧的空格 |
TRIM(s) | 去掉字符串 s 开始与结尾的空格 |
TRIM([BOTH] s1 FROM s) | 去掉字符串 s 开始与结尾的s1 |
TRIM([LEADING] s1 FROM s) | 去掉字符串 s 开始处的 s1 |
TRIM([TRAILING] s1 FROM s) | 去掉字符串 s 结尾处的 s1 |
REPEAT(str, n) | 返回 str 重复 n 次的结果 |
REPLACE(str, a, b) | 用字符串 b 替换字符串 str 中所有出现的字符串 a |
STRCMP(s1,s2) | 比较字符串 s1,s2 |
SUBSTRING(s,index,len) | 返回从字符串 s 的 index 位置其 len 个字符 |
(2)环境准备
-- 用户表
CREATE TABLE t_user (
id int(11) NOT NULL AUTO_INCREMENT,
uname varchar(40) DEFAULT NULL,
age int(11) DEFAULT NULL,
sex int(11) DEFAULT NULL,
PRIMARY KEY (id)
);
insert into t_user values (null,'张三',18,1);
insert into t_user values (null,'李四',20,0);
insert into t_user values (null,'王五',23,1);
insert into t_user values (null,'赵六',24,1);
insert into t_user values (null,'钱七',15,0);
insert into t_user values (null,'周八',12,0);
insert into t_user values (null,'吴九',60,null);
insert into t_user values (null,'郑十',null,null);
insert into t_user values (null,'John',20,1);
(3)字符串连接函数
字符串连接函数主要有2个:
函数或操作符 | 描述 |
---|---|
concat(str1, str2, …) | 字符串连接函数,可以将多个字符串进行连接 |
concat_ws(separator, str1, str2, …) | 可以指定间隔符将多个字符串进行连接 |
- 练习一:使用
concat
函数显示出:你好,uname
的结果
SELECT CONCAT('你好,' , uname) FROM t_user;
- 练习二:使用
concat_ws
函数显示出你好,uname
的结果
SELECT CONCAT_WS(',', '你好', uname) FROM t_user;
(4)字符串大小写处理函数
字符串大小写处理函数主要有2个:
函数或操作符 | 描述 |
---|---|
upper(str) | 得到 str 的大写形式 |
lower(str) | 得到 str 的小写形式 |
- 练习一: 将字符串
hello
转换为大写显示
SELECT UPPER('hello'); -- HELLO
- 练习二:将字符串
heLLo
转换为小写显示
SELECT LOWER('heLLo'); -- hello
(5)移除空格函数
可以对字符串进行按长度填充满、也可以移除空格符
函数或操作符 | 描述 |
---|---|
trim(str) | 将 str 两边的空白符移除 |
- 练习一: 将用户 id 位 8 的用户的姓名的两边空白符移除
-- 表中数据是:' lb ', 使用 trim 后是: 'lb'
SELECT TRIM(uname) FROM t_user WHERE id = 8;
(6)子串函数
字符串也可以按条件进行截取,主要有以下可以截取子串的函数;
函数或操作符 | 描述 |
---|---|
substr()、substring() | 获取子串: 1:substr(str, pos) 、substring(str, pos); 2:substr(str, pos, len)、substring(str, pos, len) |
- 练习一:获取
hello,world
从第二个字符开始的完整子串
SELECT SUBSTRING("hello,world",2)
- 练习二:获取
hello,world
从第二个字符开始但是长度为4的子串
SELECT SUBSTR("hello,world", 2, 4); -- ello
2.数值函数
(1)数值函数列表
函数 | 用法 |
---|---|
ABS(x) | 返回 x 的绝对值 |
CEIL(x) | 返回大于 x 的最小整数值(向上取整) |
FLOOR(x) | 返回小于 x 的最大整数值(向下取整) |
MOD(x,y) | 返回 x/y 的模 |
RAND() | 返回 0~1 的随机值 |
ROUND(x,y) | 返回参数 x 的四舍五入的有 y 位的小数的值 |
TRUNCATE(x,y) | 返回数字 x 截断为 y 位小数的结果 |
SQRT(x) | 返回 x 的平方根 |
POW(x,y) | 返回 x 的 y 次方 |
(2)常用数值函数练习
- 练习一: 获取
-12
的绝对值
select abs(-12);
- 练习二: 将
-11.2
向上取整
select ceil(-11.2);
- 练习三: 将
1.6
向下取整
select floor(1.6);
- 练习四: 获得
2
的32
次幂的值
select pow(2, 32);
- 练习五: 获得一个在
0-100
之间的随机整数
select ceil(rand()*100);
3.日期函数
(1)日期函数列表
函数 | 用法 |
---|---|
CURDATE() 或 CURRENT_DATE() | 返回当前日期 |
CURTIME() 或 CURRENT_TIME() | 返回当前时间 |
NOW() / SYSDATE() / CURRENT_TIMESTAMP() / LOCALTIME() / LOCALTIMESTAMP() | 返回当前系统日期时间 |
YEAR(date) / MONTH(date) / DAY(date) / HOUR(time) / MINUTE(time) / SECOND(time) | 返回具体的时间值 |
WEEK(date) / WEEKOFYEAR(date) | 返回一年中的第几周 |
DAYOFWEEK() | 返回今天是一周的第几天,注意:周日是1,周一是2,。。。周六是7 |
WEEKDAY(date) | 返回周几,注意:周1是0,周2是1,。。。周日是6 |
DAYNAME(date) | 返回星期:MONDAY,TUESDAY…SUNDAY |
MONTHNAME(date) | 返回月份:January,。。。。。 |
DATEDIFF(date1,date2) / TIMEDIFF(time1, time2) | 返回 date1 - date2 的日期间隔 / 返回 time1 - time2 的时间间隔 |
DATE_ADD(datetime, INTERVAL expr type) | 返回与给定日期时间相差 INTERVAL 时间段的日期时间 |
DATE_FORMAT(datetime ,fmt) | 按照字符串 fmt 格式化日期 datetime 值 |
STR_TO_DATE(str, fmt) | 按照字符串 fm t对 str 进行解析,解析为一个日期 |
其中:
①DATE_ADD(datetime,INTERVAL expr type)
表达式类型:
参数类型 | 参数类型 |
---|---|
YEAR | YEAR_MONTH |
MONTH | DAY_HOUR |
DAY | DAY_MINUTE |
HOUR | DAY_SECOND |
MINUTE | HOUR_MINUTE |
SECOND | HOUR_SECOND |
MINUTE_SECOND |
举例:
-- 返回一年后的今天
SELECT DATE_ADD(NOW(), INTERVAL 1 YEAR);
SELECT DATE_ADD(NOW(), INTERVAL -1 YEAR); -- 可以是负数
SELECT DATE_ADD(NOW(), INTERVAL '1_1' YEAR_MONTH); -- 需要单引号
(2)DATE_FORMAT(datetime,fmt) 和 STR_TO_DATE(str, fmt)
格式符 | 说明 | 格式符 | 说明 |
---|---|---|---|
%Y | 4位数字表示年份 | %y | 表示两位数字表示年份 |
%M | 月名表示月份(January,…) | %m | 两位数字表示月份(01,02,03。。。) |
%b | 缩写的月名(Jan.,Feb.,…) | %c | 数字表示月份(1,2,3,…) |
%D | 英文后缀表示月中的天数(1st,2nd,3rd,…) | %d | 两位数字表示月中的天数(01,02…) |
%e | 数字形式表示月中的天数(1,2,3,4,5…) | ||
%H | 两位数字表示小数,24小时制(01,02…) | %h 和 %I | 两位数字表示小时,12小时制(01,02…) |
%k | 数字形式的小时,24小时制(1,2,3) | %l | 数字形式表示小时,12小时制(1,2,3,4…) |
%i | 两位数字表示分钟(00,01,02) | %S 和 %s | 两位数字表示秒(00,01,02…) |
%W | 一周中的星期名称(Sunday…) | %a | 一周中的星期缩写(Sun.,Mon.,Tues.,…) |
%w | 以数字表示周中的天数(0=Sunday,1=Monday…) | ||
%j | 以3位数字表示年中的天数(001,002…) | %U | 以数字表示年中的第几周,(1,2,3。。)其中Sunday为周中第一天 |
%u | 以数字表示年中的第几周,(1,2,3。。)其中 Monday 为周中第一天 | ||
%T | 24小时制 | %r | 12小时制 |
%p | AM 或 PM | %% | 表示 % |
(2)常用日期函数的练习
- 练习一:获取当前的日期
SELECT CURDATE();
- 练习二:获取当前的时间(仅仅需要时分秒)
SELECT CURTIME();
- 练习三:获取当前日期时间(包含年月日时分秒)
SELECT NOW();
- 练习四:获取到五一还有多少天
SELECT DATEDIFF('2023-05-01',CURDATE())
4.流程函数
函数 | 用法 |
---|---|
IF(value,t ,f) | 如果 value 是真,返回 t,否则返回 f |
IFNULL(value1, value2) | 如果 value1 不为空,返回 value1,否则返回 value2 |
CASE WHEN 条件1 THEN result1 WHEN 条件2 THEN result2 … [ELSE resultn] END | 相当于 Java 的 if…else if…else… |
CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值1 THEN 值1 … [ELSE 值 n] END | 相当于 Java 的 switch…case… |
- 练习一:获取用户的姓名、性别,如果性别为1则显示1,否则显示0;要求使用 if 函数查询:
SELECT uname,IF(sex=1,1,0) FROM t_user
- 练习二:获取用户的姓名、性别,如果性别为 null 则显示为1;要求使用 ifnull 函数查询:
SELECT uname, IFNULL(sex, 1) FROM t_user;
- 练习三:查询用户的年龄,如果年龄小于12岁就是儿童,小于等于18岁就是少年,小于等于五十岁就是中年,否则就是老年人(使用 case when 进行查询到的内容是单独作为一个字段存在的,所以需要注意逗号的使用)
SELECT id,uname,age,CASE WHEN IFNULL(age,0) <= 12 THEN '儿童'
WHEN age <= 18 THEN '少年'
WHEN age <= 50 THEN '中年'
ELSE '老年' END '描述' FROM t_user
5.其他函数
函数 | 用法 |
---|---|
database() | 返回当前数据库名 |
version() | 返回当前数据库版本 |
user() | 返回当前登录用户名 |
password(str) | 返回字符串 str 的加密版本,41位长的字符串 |
md5(str) | 返回字符串 str 的 md5 值,也是一种加密方式 |
- 消息摘要机制:将字符串转成固定长度的密文,不能解密(使用场景:用于校验字符串的真伪,同一个字符串的密文一定是一样的)
select password("123456"); -- 不论对什么字符串加密最后结果的长度都是固定的
select md5("123456"); -- 不论对什么字符串加密最后结果的长度都是固定的
二、事务( TCL )
1.事务的概述
(1)概念
保证事务中的所有操作都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(
commit
),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback
)到最初状态。
(2)事务的原理
事务开启之后,所有的操作都会临时保存到事务日志,事务日志只有在得到
commit
命令才会同步到数据表中,其他任何情况都会清空事务日志(rollback
,断开连接)
(3)事务的使用场景
如果在某个业务中需要执行多条 SQL 语句,那么此时一般是需要使用到事务,从而保证这多条 SQL 语句执行同时成功或同时失败。例如:转账、批量删除、从购物车中提交订单等等操作
(4)事务的四大特性(ACID)
①原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
②一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
③隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
④持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
2. MySQL 进行事务管理操作
事务操作的流程:
- 在执行这一组 SQL 语句之前开启事务
- 在执行这一组 SQL 语句之后没有出现异常,提交事务
- 在执行这一组 SQL 语句的过程中但凡遇到一次异常,就回滚事务
(1)自动事务(MySQL 默认)
MySQL 默认是自动提交事务的,一条 SQL 语句就是一个事务,也就是每执行一次 SQL 语句就会自动提交一次事务
insert into t_user values (null,'John',20,1);
(2)手动开启一个事务
①方式一: 手动开启事务的方式,开启一次性事务
start transaction;
- 手动开启事务之后,执行的 SQL 语句都不会真正改变数据库中的数据,需要用户手动提交事务才能够真正执行 SQL 语句
- 在可视化工具中操作可能会有一些不同(今后写事务会在代码中进行,不会使用可视化工具和 cmd 命令行),如果在 cmd 命令行中操作语句就会吻合情况:开启事务,输入语句,最后提交(commit),如果不想提交就使用回滚(rollback),临时文件清空
②方式二: 设置 MySQL 中的自动提交的参数(了解),让这一次的连接,都变成不自动提交的事务
第一步: 查看 MySQL 中事务是否自动提交
show variables like '%commit%';
第二步: 设置自动提交的参数为 OFF
-- 0:OFF 1:ON
set autocommit = 0;
③提交和回滚事务
Ⅰ、提交事务
当这个事务中的 SQL 语句执行完毕之后,没有出现任何问题,那么我们需要在最后提交事务,让这些 SQL 语句真正执行去改变数据库中的数据
commit;
Ⅱ、回滚事务
当执行这个事务中的 SQL 语句的过程中,一旦出现问题或者异常,则需要回滚事务,从而回到 SQL 语句执行之前的状态
rollback;
3.事务的隔离级别
(1)不考虑事务的隔离性会引发的问题
事务在操作时的理想状态: 所有的事务之间保持隔离,互不影响。因为并发操作,多个用户同时访问同一个数据。可能引发并发访问的问题
并发访问的问题 | 含义 |
---|---|
脏读 | 一个事务读取到了另一个事务中尚未提交的数据 |
不可重复读 | 一个事务中两次读取的数据内容不一致,要求的是一个事务中多次读取时数据是一致的,这是事务 update 时引发的问题 |
幻读 | 一个事务中两次读取的数据的数量不一致,要求在一个事务多次读取的数据的数量是一致的,这是 insert 或 delete 时引发的问题 |
(2)事务隔离级别
可以通过设置事物隔离级别解决读的问题
①事务四个隔离级别
级别 | 名字 | 隔离级别 | 脏读 | 不可重复读 | 幻读 | 数据库默认隔离级别 |
---|---|---|---|---|---|---|
1 | 读未提交 | read uncommitted | 是 | 是 | 是 | |
2 | 读已提交 | read committed | 否 | 是 | 是 | Oracle |
3 | 可重复读 | repeatable read | 否 | 否 | 是 | MySQL |
4 | 串行化 | serializable | 否 | 否 | 否 | 最高的隔离级别 |
隔离级别越高,性能(效率)越差,安全性越高。
②设置隔离级别
- 设置事务隔离级别
set session transaction isolation level 隔离级别;
-- 例如: 设置事务隔离级别为: read uncommitted
set session transaction isolation level read uncommitted;
- 查询当前事务隔离级别
select @@tx_isolation;
4.演示数据库安全性问题
(1)准备工作
create table account(
id int primary key auto_increment,
name varchar(20),
money double
);
insert into account values (null,'zs',1000);
insert into account values (null,'ls',1000);
insert into account values (null,'ww',1000);
(2)演示脏读
- 一个事物里面读到了另外一个事物没有提交的数据:read uncommitted
- 开启 A,B 窗口
- 分别查询 A,B 的隔离级别
select @@tx_isolation;
- 设置 A 窗口的隔离级别为 read uncommitted (读未提交)
set session transaction isolation level read uncommitted;
- A,B 都开始事物
- 在 B 中张三向李四转账100,事物不提交
- 在 A 中查询账户
(3)演示不可重复读(解决脏读)
- 不可重复读:在一个事物里面,同一条语句,两次查询的结果不一致
- 开启 A,B 窗口
- 分别查询 A,B 的隔离级别
select @@tx_isolation;
- 设置 A 窗口的隔离级别为 Read committed (读已提交)
set session transaction isolation level Read committed;
- A,B 都开始事物
- 在 B 中张三向李四转账100,事物不提交
- 在 A 中查询账户(避免脏读发生)
- B 中提交事物
- 在 A 中查询账户(两次查询的结果不一致,不可重复读发生)
(4)演示避免不可重复读
- 开启 A,B 窗口
- 分别查询 A,B 的隔离级别
select @@tx_isolation
- 设置A窗口的隔离级别为Repeatable read
set session transaction isolation level Repeatable read;
- A,B 都开始事物
- 在 B 中张三向李四转账100,事物不提交
- A 中查询账户
- B 中提交
- A 中查询账户
- A 中结束事物,再重新查询
(5)演示隔离级别 Serializable
- 开启 A,B 窗口
- 分别查询 A,B 的隔离级别
select @@tx_isolation
- 设置A窗口的隔离级别为 Serializable
set session transaction isolation level Serializable;
- A,B 都开始事物
- B 中向 account 账户插入一条数据,不提交
- A 中查询
- 在 B 中结束事物
- A 中查询
三、DCL 语句
我们现在默认使用的都是 root 用户,超级管理员,拥有全部的权限。但是,一个公司里面的数据库服务器上面可能同时运行着很多个项目的数据库。所以,我们应该可以根据不同的项目建立不同的用户,分配不同的权限来管理和维护数据库。
1.创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
关键字说明:
- 用户名:将创建的用户名
- 主机名:指定该用户在哪个主机上可以登陆,如果是本地用户可用:
localhost
,如果想让该用户可以从任意远程主机登陆,可以使用通配符:%
- 密码:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器
具体操作:
-- user1 用户只能在 localhost 这个 IP 登录 MySQL 服务器
CREATE USER 'user1'@'localhost' IDENTIFIED BY '123';
-- user2 用户可以在任何电脑上登录 MySQL 服务器
CREATE USER 'user2'@'%' IDENTIFIED BY '123';
2.授权用户
用户创建之后,基本没什么权限,需要给用户授权
授权格式:
GRANT 权限1, 权限2... ON 数据库名.表名 TO '用户名'@'主机名';
关键字说明:
GRANT
:授权关键字- 授予用户的权限,如:
SELECT
,INSERT
,UPDATE
等。如果要授予所的权限则使用ALL
数据库名.表名
:该用户可以操作哪个数据库的哪些表。如果要授予该用户对所有数据库和表的相应操作权限则可用*
表示,如:*.*
'用户名'@'主机名'
:给哪个用户授权
具体操作:
- 给 user1 用户分配对 test 这个数据库操作的权限
GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON test.* TO 'user1'@'localhost';
- 给 user2 用户分配对所有数据库操作的权限
GRANT ALL ON *.* TO 'user2'@'%';
3.撤销授权
REVOKE 权限1, 权限2... ON 数据库.表名 FROM '用户名'@'主机名';
具体操作:
- 撤销 user1 用户对 test 操作的权限,首先需要查看权限
SHOW GRANTS FOR 'user1'@'localhost'; --查看权限
REVOKE ALL ON test.* FROM 'user1'@'localhost';
4.查看权限
SHOW GRANTS FOR '用户名'@'主机名';
具体操作:
- 查看 user1 用户的权限
SHOW GRANTS FOR 'user1'@'localhost';
5.删除用户
DROP USER '用户名'@'主机名';
具体操作:
- 删除 user2
DROP USER 'user2'@'%';
6.修改用户密码
(1)修改管理员密码
mysqladmin -uroot -p password 新密码 -- 新密码不需要加上引号
注意:需要在未登陆 MySQL 的情况下操作。
具体操作:
mysqladmin -uroot -p password root
输入老密码
(2)修改普通用户密码
set password for '用户名'@'主机名' = password('新密码');
注意:需要在登陆 MySQL 的情况下操作。
具体操作:
set password for 'user1'@'localhost' = password('666666');
四、经典问题
1. 编码问题(了解)
(1)命令行操作 SQL 乱码问题
mysql> INSERT INTO t_stu VALUES(1,'张三','男');
ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'sname' at row 1
(2)修改 my.ini 配置文件
在路径:mysql的数据存储路径下 找到my.ini文件
修改内容1:
找到[mysql]命令,大概在63行左右,在其下一行添加
default-character-set=utf8
修改内容2:
找到[mysqld]命令,大概在76行左右,在其下一行添加
character-set-server=utf8
collation-server=utf8_general_ci
修改完毕后,重启MySQL57服务
查看编码命令
show variables like 'character_%';
show variables like 'collation_%';
- 如果是以上配置就说明对了
(3) 命令行操作 SQL 仍然乱码问题
mysql> INSERT INTO t_stu VALUES(1,'张三','男');
ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'sname' at row 1
- 原因:按照刚才的配置,服务器端认为你的客户端的字符集是 utf-8,而实际上你的客户端的字符集是GBK。
- 查看所有字符集:
SHOW VARIABLES LIKE 'character_set_%';
- 解决方案:设置当前连接的客户端字符集:
SET NAMES GBK;
set names gbk;
是为了告诉服务器,客户端用的 GBK 编码,防止乱码。- 有的时候,这样还不能解决,例如,某些win10操作系统环境下,那么修改命令行的属性→选项→勾选使用旧版控制台,然后重启电脑
2.忘记 root 用户密码问题
操作步骤:
- 关闭 MySQL57 服务
-- 以管理员权限运行 cmd
net stop MYSQL57
- 设置 mysqld 服务不检查权限密码
MySQL 5.5 版本:
mysqld --skip-grant-tables
MySQL 5.7版本
-- 修改 my.ini 文件
-- 在 [mysqld] 下方添加
skip-grant-tables = true
- 开启 MySQL57 服务
-- 以管理员权限运行 cmd
net start MYSQL57
mysql -uroot
无密码登陆服务器- 修改 root 账户的密码为 “root”
MySQL 5.5版本
update user set authentication_string=password("root") where user="root";
MySQL 5.7版本
update mysql.user set authentication_string=password('root') where user='root';
- 刷新:
flush privileges;
- 退出登录的 MySQL
exit;
-
修改my.ini文件,删除掉之前添加在 [mysqld] 下方的那一行
-
验证无密码登录是否会失败
mysql -uroot
-
以新密码登录:
mysql -uroot -proot
3.查看字符集和校对规则
关于 SQL 的关键字和函数名等不区分大小写,但是对于数据值是否区分大小写,和字符集与校对规则有关。
_ci(大小写不敏感),_cs(大小写敏感),_bin(二元,即比较是基于字符编码的值而与 language 无关)
(1)查看所有字符集和和其默认的校对规则
(2)查看 GBK 和 UTF-8 字符集的校对规则
show collation like 'gbk%';
show collation like 'utf8%';
utf8_unicode_ci和utf8_general_ci
对中、英文来说没有实质的差别。utf8_general_ci
校对速度快,但准确度稍差。utf8_unicode_ci
准确度高,但校对速度稍慢。- 如果你的应用有德语、法语或者俄语,请一定使用
utf8_unicode_ci
。一般用utf8_general_ci
就够了。
(3)查看服务器的字符集和校对规则
(4)查看和修改某个数据库的字符集和校对规则
或
- 修改数据库的字符集和校对规则:
ALTER DATABASE 数据库名称 DEFAULT CHARACTER SET 字符集名称 [COLLATE 校对规则名称];
例如:
ALTER DATABASE ceshi_db DEFAULT CHARACTER SET utf8 collate utf8_general_ci;
注意:修改了数据库的默认字符集和校对规则后,原来已经创建的表格的字符集和校对规则并不会改变,如果需要,那么需要单独修改。
(5)查看某个表格的字符集和校对规则
- 查看字符集:
show create table users;
- 如果要查看校对规则:
show table status from bookstore like '%users%' ;
- 修改某个表格的字符集和校对规则:
修改表的默认字符集:
ALTER TABLE 表名称 DEFAULT CHARACTER SET 字符集名称 [COLLATE 校对规则名称];
- 把表默认的字符集和所有字符列(CHAR,VARCHAR,TEXT)改为新的字符集:
ALTER TABLE 表名称 CONVERT TO CHARACTER SET 字符集名称 [COLLATE 校对规则名称];
例如:
ALTER TABLE ceshi_table DEFAULT CHARACTER SET gbk collate gbk_chinese_ci;