已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精品文档 1欢迎下载 mysqlmysql 数据库数据库 第第 1 1 版版 小编 郑保珍小编 郑保珍 为什么要使用数据库 海量存储高速查询为什么要使用数据库 海量存储高速查询 1 1 登录与服务 登录与服务 登录 mysql uroot proot 登录本机 mysql 服务器 mysql uroot proot h 192 168 10 1 登录 ip 为 192 168 10 1 的 mysql 服务器 退出 exit q quit Ctrl c 服务 net stop mysql 停止 mysql 服务 net start mysql 启动 mysql 服务 net restart mysql 重启 mysql 服务 C 注意最后没有封号 2 mysql2 mysql 编码 编码 set names gbk utf8 临时编码设置 当再次进入 mysql 中的时候将再次转变为默认编码 status s 查看编码 show variables like charac 查看编码 Server characterset utf8 服务器编码 Db characterset utf8 当前数据库编码 Client characterset utf8 客户编码 Conn characterset utf8 客户连接编码 character set client utf8 客户编码 character set connection utf8 连接编码 character set database utf8 当前数据库编码 character set results utf8 结果集 character set server utf8 服务器 character set system utf8 系统 3 database3 database 操作 操作 1 查看和切换 显示当前所有数据为名称 show databases show schemas 查看当前使用的数据库 select database 切换或进入当前数据库 use db name 2 创建 create database schema if not exists db name default character set 字符集 精品文档 2欢迎下载 查看 show create database db name 删除 drop database db name 4 data4 data 类型类型 数值 tinyint 1 个字节 有符号 128 到 127 无符号 0 255 smallint 2 个字节 3 27w 正负 mediumint 3 个字节 3000w int 4 个字节 21 亿正负 int 和 int 5 都是 4 个字节 21 亿正负 基本无区别 bigint 8 个字节 总结 int M zerofill 加上 zerofill 后 M 才表现出有点点效果 比如 int 3 zerofill 你插入 到数据库里的是 10 则实际插入为 010 也就是在前面补充加了一个 0 如果 int 3 和 int 10 不加 zerofill 则它们没有什么区别 不是用来限制 int 个数的 int M 的最大值和最小值与 undesigned 有关 如下图 mysql create table t t int 3 zerofill mysql insert into t set t 10 mysql select from t t 010 mysql create table t t int zerofill mysql insert into t set t 10 mysql select from t t 0000000010 mysql create table t t int mysql insert into t set t 10 mysql select from t t 10 其实当我们在选择使用 int 的类型的时候 不论是 int 3 还是 int 11 它在数据库里面存储的都 是 4 个字节的长度 在使用 int 3 的时候如果你输入的是 10 会默认给你存储位 010 也就是说这个 3 代表的是默认的一个长度 当你不足 3 位时 会帮你补全 当你超过 3 位时 就没有任何的影响 他 们之间除了在存储的时候稍微有点区别外 在我们使用的时候是没有任何区别的 int 10 也可以代表 2147483647 这个 值 int 11 也可以代表 要查看出不同效果记得在创建类型的时候加 zerofill 这 个值 表示用 0 填充 否则看不出效果的 我们通常在创建数据库的时候都不会加入这个选项 所 精品文档 3欢迎下载 以可以说他们之间是没有区别的 float M D 4 或 8 个字节 M 代表小数的总位数 D 代表小数点后的位数 Float 6 2 9999 99 到 9999 99 M 最大位数 10 的 38 次方 D 的位数也是 10 的 38 次方 如果 M创建表时创建 create table table name 属性名 数据类型 unique deptno int unique constraint uk name unique 字段名 unique index key 索引名 字段名 长度 asc desc unique index index deptno deptno 2 创建索引 create unique index 索引名 on table name 属性名 长度 asc desc 3 修改索引 alter table table name add unique index key 索引名称 字段 3 3 普通索引 普通索引 所谓普通索引 就是在创建索引时 不附加任何限制条件 唯一 非空等限制 该类型的索引可以添加 创建在任何数据类型的字段上 启用索引 alter table table name enable 启用 keys 禁用索引 alter table table name disable 禁用 keys 查看索引 show indexes from table name 删除索引 drop index 索引名称 on table name alter table table name drop index 索引名称 单列索引 单列索引 1 创建表时 create table table name 属性名 数据类型 属性名 数据类型 index key 索引名 属性名 长度 asc desc index index deptno deptno 2 创建索引 create index 索引名 on table name 属性名 长度 asc desc 3 修改索引 alter table table name add index key 索引名称 字段 多列索引 多列索引 1 创建表时 create table table name 属性名 数据类型 deptno int dname varchar 20 index key 索引名 属性名 长度 asc desc 属性名 长度 asc desc 精品文档 9欢迎下载 index key index deptno dname deptno dname 2 创建索引 create index 索引名 on table name 属性名 属性名 属性名 eg create index index deptno dname on t dept deptno dname 3 修改索引 alter table table name add index key 索引名称 字段 1 字段 2 字段 3 eg alter table test3 add index key index deptno dname deptno dname 4 4 全文索引 全文索引 全文索引主要关联在数据类型为 CHAR VARCHAR 和 Text 的字段上 以遍能够更加快速的查询数据量 较大的字符串类型的字段 Mysql3 23 版本开始支持全文索引 只能在存储引起为只能在存储引起为 MyISAMMyISAM 的数据库表上的数据库表上 创建全文索引 在默认情况下 全文索引的索引方式不区分大小写 如果全文索引所关联的字段为二进 制数据类型的话 则区分大小写 1 创建表时 create table table name 属性名 数据类型 属性名 数据类型 FULLTEXT index key 索引名 属性名 长度 asc desc FULLTEXT index deptno deptno 2 创建索引 create FULLTEXT INDEX 索引名 on table name 属性名 长度 asc desc 3 修改索引 alter table table name add FULLTEXT INDEX KEY 索引名称 字段 5 5 自增长自增长 约束约束 auto incrementauto increment 当数据库表中插入新纪录时 字段上的值会自动生成唯一的 ID 在具体设置 auto increment 约束的 时候 一个数据库表中只能有一个字段使用该约束 该数据类型是整数类型 由于设置 auto increment 约束后字段会生成唯一 ID 所以该字段也经常设置成 PK 主键 create table test7 id int unsigned not null auto increment primary key auto increment 100 修改 auto increment 的值 alter table table name auto increment 值 5 5 外键外键 约束约束 foreignforeign 前面的约束都是针对单个数据表的 外键约束是保证多个表 常为两个表 之间的参照的 比如 有 两个表 部门表和雇员表 然后雇员表中有一个表示部门编号的字段 deptno 其依赖于部门表的主键 这样字段 deptno 就是雇员表的外键 通过该字段部门表和雇员表建立了关系 注意 在具体设置 FK 约束时 设置 FK 约束的字段必须依赖于数据库中已经存在的父表的主键依赖于数据库中已经存在的父表的主键 同 时外键可以为 NULL create table table name 属性名 数据类型 constraint FK name foreign key 子表字段 references father table name 父表字段 精品文档 10欢迎下载 alter table table name add constraint FK name foreign key 字字段 references father table name 父字段 6 6 外键外键 约束约束 NULLNULL 问题 在见表的时候 列后面 not null default default 0 这里的 not null 是什么意思呢 答案 就是让这个列的值不为 null 如果某个列确实没有填值 也有默认值 也不为 null 问题 为什么不希望这里的值为 null 呢 答案 不好比较 null 本身是一种类型 比较式只能用专门的 is null 和 is nut null 来比较 遇到运 算符一 律返回 null 假设记录有 null 比如 select from books where name null 这个时候 也无法取到任 何记录 而且 null 影响索引的效率 也就影响查询的效率 select from books where name is not null 这个时候会把所有 name 不是 null 的记录取出 来 select from books where name is null 这个时候会把所有 name 是 null 的记录取出来 问题 null 和空字符 有什么去别呢 答案 null 就是 null 判断是不是 null 有专门的 is not null 和 not null 就像去银行的话 连卡都 没有 空字符 没有内容 就像去银行 有卡但是没有钱 7 DML 7 DML 添加记录 insert into table name 字段名称 values 字段值 insert into table name 字段名称 values 字段值 字段值 insert into table name select 字段名称 from table name1 insert table name 字段名称 select 字段名称 from table name insert into database name1 table name1 SELECT 字段 1 字段二 from database name2 table name2 修改记录 update table name set 字段名称 值 where order by limit 删除记录 delete from table name where order by limit 慢 删记录空间保留 truncate table table name 稍快 删除记录空间回收 alter table table name auto increment 1 8 DQL8 DQL 单表查询操作 单表查询操作 精品文档 11欢迎下载 简单数据查询 简单数据查询 所有字段 select from table name 查询特定字段和其他剩余字段 select other 字段 from table name 指定字段 select 字段 1 字段 2 from table name 关键字 distinct 去除重复记录 select DISTINCT 字段 字段 from table name 四则运算 查询 select name sal 12 from t employee 设置显示格式数据查询 关键字 CONCAT 链接字符串 select CONCAT ename 雇员的年薪为 sal 12 as yearsalary from tabale name select from emp where hiredate 1998 01 01 select from emp where year hiredate 1998 select year 2000 01 11 条件数据查询 条件数据查询 between and select from test where age 50 and 2 查询部门人数 最高工资 最低工资 平均工资 工资总和 select count as 部门人数 max salary as 最高工资 min salary as 最低工资 avg salary 平均工资 sum salary 工资总和 from emp G 3 以 dept Id 分组查询 select from emp group by dept id 4 查询以 dept id 分组后 每组的记录数 和 dept id select dept id count from emp group by dept id 5 使用 with rollup 后 把每组的统计数再次统计总和 select dept id count as total from emp group by dept id with rollup 精品文档 14欢迎下载 dept id total 1 4 2 3 3 2 4 2 NULL 11 select from emp group by dept id having count 3 select dept id count as total from emp group by dept id having count 3 select count as total from emp group by dept id having count 3 select dept id count as 部门人数 min salary 最低工资 max salary 最高工资 avg salary 平均工资 from emp group by dept id having avg salary 20000 dept id 部门人数 最低工资 最高工资 平均工资 1 4 30000 00 900000 00 280000 000000 2 3 10000 00 300000 00 170000 000000 3 2 20000 00 900000 00 460000 000000 4 2 9000 00 600000 00 304500 000000 mysql select dept id count as 部门人数 min salary 最低工资 max salary 最高工资 avg salary 平均工资 from emp group by dept id having avg salary 300000 order by dept id desc dept id 部门人数 最低工资 最高工资 平均工资 4 2 9000 00 600000 00 304500 000000 3 2 20000 00 900000 00 460000 000000 select dept id count as 部门人数 min salary 最低工资 max salary 最高工资 avg salary 平均工资 from emp group by dept id having avg salary 300000 order by dept id desc limit 1 1 dept id 部门人数 最低工资 最高工资 平均工资 3 2 20000 00 900000 00 460000 000000 精品文档 15欢迎下载 inset into result name subject score values 张三 数学 90 张三 语文 50 张三 地理 40 李四 语文 55 李四 政治 45 王五 政治 30 赵六 语文 100 赵六 数学 99 赵六 品德 98 题目 查询出挂科 2 门以及 2 门以上的学员的平均分 方案一 逆向思维 先查出所有人的平均分 然后再筛选 第一步 查询所有人的平均分 第二部 计算出每个人的挂科情况 通过 g 标志处挂科结果 第三部 挂科数目就是 g 的 sum 结果 第四部 每个人的平均分以及挂科数已经算出 再 having 筛选一下即可得出最终结果 方案二 先找出谁的挂科数 2 找到这些人再求这些人的平均分 第一步 找出谁挂科了 精品文档 16欢迎下载 查出来的结果可以当成表来看 mysql select from emp order by rand limit 3 id empname hiredate salary dept id 2 李四 1989 01 01 20000 00 3 8 杨幂 2012 01 01 600000 00 4 11 凤姐 2014 02 01 900000 00 1 查询所有字段和不重复的 dept id 的总数 select count distinct dept id from emp 查询不重复的 empname select distinct empname from emp mysql select from emp id empname hiredate salary dept id 9 柳岩 2013 04 01 900000 00 3 10 高圆圆 2014 01 01 100000 00 1 11 凤姐 2014 02 01 900000 00 1 精品文档 17欢迎下载 12 高圆圆 2014 01 01 100000 00 1 mysql select distinct from emp id empname hiredate salary dept id 9 柳岩 2013 04 01 900000 00 3 10 高圆圆 2014 01 01 100000 00 1 11 凤姐 2014 02 01 900000 00 1 12 高圆圆 2014 01 01 100000 00 1 mysql select all from emp id empname hiredate salary dept id 9 柳岩 2013 04 01 900000 00 3 10 高圆圆 2014 01 01 100000 00 1 11 凤姐 2014 02 01 900000 00 1 12 高圆圆 2014 01 01 100000 00 1 子查询子查询 嵌套查询嵌套查询 where 型子查询 select from 表名 delete from 表名 update 表名 字段 值 where 字段 in 子查询 select 字段 from 表名 如果 where 列 内层 sql 则内层 sql 返回的必须是单行单列 也就是单个值 如果 where 列 in 内层 sql 则内层 sql 只能返回单列 可以多行 也就是一列的多个值 1 查出表中 good id 最大的一条商品 select goods id goods name from goods order by goods id desc limit 0 1 select goods id goods name from goods where id select max goods id from goods 2 查出表中每个栏目下的 good id 最大的商品 select goods id goods name from goods where goods id in select max goods id from goods group by cat id from 型子查询 精品文档 18欢迎下载 内层 sql 的查询结果 当成一张临时表 供外层 sql 再次查询 1 查询每个栏目 cai id 下 id 号最大的商品 select from select goods id goods name cat id from goods order by cat id goods id desc as temp group by cat id 原理 利用分组查询的时候 会拿出每个栏目的第一条记录作为代表显示 exists 型子查询 把外层 sql 查询的结果 拿到内层 sql 中去测试 如果内层 sql 成立 则该行取出 1 查询出栏目表下面有商品的栏目表 select cat id cat name from category where exists select from goods where goods cat id category cat id 原理 1 我们查询商品的栏目表 category 中涉及到的所有字段 2 但是这些栏目中哪些是有商品的呢 我们就把 category cat id 拿到 where 条 件中去匹配 如果 select from goods where goods cat id category cat id 根 据外层的 category cat id 查到了结果则 返回真 这个时候外层查询结果取出 如果查不到结果返回假 则外层查询结果不被取出 多表查询 多表查询 全相乘查询 仅供熟知 禁止使用 select table 1 字段 1 table 2 字段 2 from table 1 table 2 where table 1 字段 table 2 字段 select goods id goods name category cat id from goods category where goods id category cat id 原理介绍 有两个表 A 1000 条记录 B 1000 条记录 如果全相乘查询的话 相当于在 mysql 的内存中生成了一个临时表 而这个临时表的数据量是 1000 1000 可以说 的非 常的庞大 再在此表中进行筛选查询 缺 点 1 产生庞大的临时表占据内存 给服务器带来极大的压力 2 产生的临时表中没有任何索引 效率极其低下 左 右 连接查询 select table 1 字段 1 table 2 字段 2 from table 1 left join table 2 on table 1 字段 table 2 字段 精品文档 19欢迎下载 left join table 3 on table 1 字段 table 4 字段 原理介绍 假设 A 表在左边不懂 B 表在右边滑动 A 表通过一个 A 表与 B 表的条件关系来 筛选 B 表的行 条件关系为真的时候取出 两个表在数据融合的时候 匹配条 件的时候 都是通过索引可以找到的 比如 A 表中的 goods id 4 的首先通过 条 件找到 然后通过索引找到 category id 4 进行 on goods id category id 的匹配 然而全相乘是全部相乘后 然后再 where category id goods id 筛选 优 点 1 A B 两个表中的索引可以起到作用 比全相乘快至少 14 倍 左右连接可以互换 就比如你站在我的左边 那么就相当于我站在你的右边 A left join B 等价于 B right join A 注意 既然左右连接可以互换 尽量用左连接代替右连接 以便移植到其他类型数据库时 兼 容性方面的考虑 手册推荐左链接 也适合我们的思维习惯 内连接查询 内连接是左右连接的交集 select 字段名称 from table1 inner join table2 on 条件 select e id e empname d deptname from emp e inner join dept d on e dept id d id union 查询 合并两条或者多条查询结果集 语法 sql1 union sql2 sql1 union all sql2 1 能否从 2 张不同的表查询后在 union 呢 答案 可以 union 合并的是 结果集 它才不区分结果集是来自于那张表呢 2 在 union 的时候 如果要合并的两个结果集中的字段不一样 我们可以用别名 as 的方 法把他们起成别名和原名称 或者别名和别名一直后在合并 但如果我们不通过这种方法 并且字段名不一样的话 还能否 union 答案 可以 只是取出来的最终别名以第一条 sql 中的字段为准 3 union 满足什么条件的时候就可以进行合并呢 精品文档 20欢迎下载 答案 只要合并的所有 sql 中字段数目一直就 ok 4 别的类型不一样 也可以吗 答案 可以 就像第 3 题说的 只要字段数目一直就可以 不过存储量要差不多 不然会 造 成数据的丢失 5 union 后的结果集 是否可以再次排序呢 答案 可以再次排序 6 使用 order by 的注意事项 思考如下语句 如下内层语句中的 desc 怎么没有发挥作用呢 SELECT goods id cat id goods name shop price FROM goods WHERE cat id 4 ORDER BY shop price DESC UNION SELECT goods id cat id goods name shop price FROM goods WHERE cat id 5 ORDER BY shop price DESC ORDER BY shop price ASC 答案 外层语句还要对最终结果再次进行排序 所以内层的语句的排序就没有意义了 注意 内层的 order by 语句单独使用 只是排序 对查询的结果集没有应吸纳过得时候 在 执行期间就被 MYSQL 的代码分析器给优化掉了 内层的 order by 必须能够影响到结果集的时候才有意义 比如配合 limit 使用 7 如果查询第 3 个栏目下价格前 3 高的商品和第 4 个栏目价格前 2 高的商品 用 union 合 并 答案 这一次内层的 order by 发挥了作用 原因 因为由于 limit 截取记录的话 内层中的 order by 是会影响结果集的 也就是说这 个 时候的 order by 排序是有意义的 8 如果 Union 后的结果集有重复 即某行或某 N 行 所有的列值都一样 怎么办 答案 这种情况是比较常见的 会默认去掉重复记录 值保留不重复的记录 精品文档 21欢迎下载 9 如果 Union 后的结果集有重复 我们不想默认去掉重复 怎么办 答案 union all 连接就可以了 10 由 A 表和 B 表 得到 C 表 A 表对应字段数据 B 字段对应数据 C 表所有的数据 答案 select id sum num from select from A unionunion allall select from B as tmp group by id 注意 必须是 union all 不然会去掉临时表的重复值 造成数据不全 9 9 函数 函数 问题 如果 mysql 函数和 PHP 函数都实现某个功能 优先用哪一个 答案 1 msyql 的函数肯定是要影响查询速度的 应该在建表的时候 通过合理的表结构减少函数 的使用 比如 email 按 前后拆分 2 如果确实要用函数 比如时间格式化 mysql 里用 date format 在 php 里用 date 优先把函数放在业务逻辑层 也就是 php 层处理 3 在查询时使用了函数 最大的一个坏处 以 date format A 则 A 列的索引将无法使用 4 入股欧尼针对某列查询 而此列用上了函数来判断 此列将不再使用索引 举例 select name email from talbe where right position email email 列使用了索引 可以加快查询速度 但是因为你使用的并不是 email 列 而是函数 处 理后的 email 的返回值 因此 email 列的索引就不再起作用 查询也就非常缓慢了 10 10 mysqlmysql 视图 视图 1 视图 view 作用 1 可以简化我们的查询 比如 复杂的统计时 先用视图生成一个中间结果 再查询视图 2 更精细的权限控制 比如 某张用户表为例 现在 有两个网站合作 可以查询对方网站的用户信息 需要 精品文档 22欢迎下载 向对方开放用户表的权限 又不想开放用户表中的密码字段 create view v use AS select user id username email from user 可以开放这个没有密码字段的视图权限给对方 3 数据多 分表是可以用到 比如 小说站 article 表 1000 多万篇 数据量太大 这个时候可以把小说的记录纵 向 分成 article1 article2 article3 article5 这 5 张表每张表放 200 万 就可以了 查询小说时 不知道在哪张表 create view v article as select title from article2 union select title from article2 union select title article 3 这个时候可以把要查的字段 从五张表中取出来放到一个视图里 查这个视图 2 视图特性 1 视图中必须存放 select 查询语句 视图可以当做表用 2 视图就像是一个表的影子 当表发生改变的时候 已经创建好的视图也随着发生改变 3 视图是否可以修改 不建议对视图执行 insert update delete 操作 可以修改的情况 视图和表的数据一一对应 不可以修改的情况 视图和表的数据不一一对应 什么就叫做一一对应呢 答案 一一对应是指 根据 select 关系 从表中取出的行 只能计算出视图中确定的 一 行 反之 视图中任意抽出一行 也能够返回出表中的具体确定一行 就像函 数 的映射一样 视图中的某字段的平均数 和 差 和该字段中的数据不是一一对 应 或者视图中已经进行了重新排序和 limit 都不是一一对应 只有本字段和 本字 段才算 由表的数据可以推出视图的数据 由视图的数据可以推出表的数 据 但 是如果视图中是平均数 和 查的话 是推不出表中每个数据的数值的 4 数据库数据 data 存储的格式 frm 代表表的结构 是定义文件 NYD 代表表的数据 NYI 代表表的索引 视图文件的话 是没有 NYD 和 NYI 的 只有一个 frm 文件 没有真实的数据 有的只 是 一个关系结构 3 视图的 algorithm 思考 相比于建临时表 哪个快 建表 查询 形成临时表 查询临时表 慢 精品文档 23欢迎下载 叠加 合并条件 查询表 快 algorithm merge 当引用视图时 引用视图的语句与定义视图的语句合并 temptable 当引用视图时 根据视图的创建语句建立一个临时表 undefined 未定义 自动 由系统帮你判断 algorithm merge merge 意味着视图只是一个规则 语句规则 当查询视图时 把查询视图的语句 比 如 where 那些 与创建时的语句 where 子句等合并分析形成一条 select 语句 建一张简单的查询视图 不用临时表 只用条件合并 create algorithm merge view v1 AS select from goods where shop price 300 查询视图语句 select goods id goods name shop price from v1 where shop price 300 500 这个简单的查询还建临时表的话 开销就 有点大 这个时候 我们可以指定 algorithm 选项为 merge algoithm temptable 1 此例子为 algoithm merge 的错误示范 建立视图 create view v2 AS select from goods order by cat id asc shop price desc 查询视图 查询每个栏目最高的商品价格 select from v2 group by cat id 最终执行语句 select from goods order by cat id asc shop price desc group by cat id 此句 order by 和 group by 的顺序明显发生语法错误 前后颠倒 2 此例子为例 1 中的正确示范 建立视图 create algoithm temptable view v2 AS select from goods order by cat id asc shop price desc algorithm undefined 如果不知道该用什么哪种方式 则 algorithm undefined 让系统自动选择 4 视图语法 精品文档 24欢迎下载 1 创建视图 create view 视图名称 as 查询语句 2 使用视图 把视图当表用 select from 视图名 select 字段 字段 字段 from 视图名称 select from 视图名 where 条件 3 修改视图 alter view 视图名 as 查询语句 4 删除视图 drop view 视图名 5 查询创建视图的 sql show create view 视图名称 6 查看视图 1 show tables 进入该数据库的前提下 查看指定数据库中的视图 2 information schema 库表 tables 没进入数据库的前提下 查看指定数据中的 视图 注意 table name 被查的视图名称 table schema 被查的视图或表存放在的数据库名字 查询所有视图 use information schema select table schema table name table type from tables where table schema 库名 and table type view 查询某个库所表和视图 use information schema select table schema table name table type from tables where table schema 库名 7 php 调用视图 select from v hotnews 精品文档 25欢迎下载 11 11 编码方式与乱码 编码方式与乱码 1 出现乱码的情况有两种 第一种情况 第二种情况 2 乱码原理 1 网页乱码 1 文件本身的编码方式 默认的是 ANSI 对应浏览器的 GBK 我们一般改成 UTF 8 2 为避免一些编码错误 我们使用 UTF 8 无 BOM 3 ajax 以 get 方式提交中文时有乱码 iconv 2 数据库乱码 第一 set character set client gbk 正确指定客户端的编码方式 指定接受到的命令是以什么编码方式进入数 据 库系统 这个编码只会影响我们在黑框终端里看到的中文数据是否是 GBK 正 常显示 但是不会影响网页调用 不过在插入中文的话 必须定为 GBK 不 然 肯定插不进去 第二 set character set connection utf8 合理选择连接器编码 第三 set character set results gbk 正确指定返回内容的编码 从服务器上已经存储好的数据往回取的时候 我 们还需要告诉连接器 应该给我转成什么格式返回 注意 1 UTF8 GBK GB2312 latin1 字节大小 2 服务器 conntiontion client 选择编码方式 字节大小 3 client results 终端下也不会出现乱码 4 连接器的作用 连接客户端与服务器 客户端的字符先发给连接器 连 接器选择一种编码将其转换 临时存储 再次转换成服务器需要的编 码 并存储在服务器 精品文档 26欢迎下载 例子 1 客户端存 GBK 返回的结果 GBK 连接器 GBK set names GBK 可以一句话 设置着三个编码都是 GBK 客户端存 GBK 返回的结果 GBK 连接器 UTF8 插入中文 没有出现乱码 例子 2 在例子 1 的基础上 客户端存 UTF8 set character set client utf8 插入中文 就相当于 我插入的数据时 GBK 编码 当时客户端却认 为是 UTF8来解析 这个乱码对应的 GBK 内码在转化成 UTF8 的时候压根就 出错 在严格模式下根本无法插入中文 乱码形式如下 在非严格模式下可以插入数据 但是造成了无法修复的乱码 乱码如下 例子 3 客户端存 GBK 返回的结果 utf8 服务器最终存 UTF8 set character set client gbk set character set results utf8 set character set connection utf8 客户端插入的数据时 GBK 的 但是存储以后 我偏要返回的数据以 utf8 返回 乱码形式如下 但是这个时候插入中文的话 虽然再次查询依旧是乱码 但是却没有造 成字节数丢失等的错误 在 set character set results gbk 以后 一切恢 复正常 例子 4 客户端存 GBK 返回的结果 GBK 连接器 latin1 因为 latin 存储字节数小 GBK 大 当大字节数存储格式转化为小字节 数 的存储方式时 由于数据放不下 而造成了字节数的丢失 所以插入 中 文数据的时候 出现无法恢复的乱码 乱码形式如下 3 新旧网站并存案例 精品文档 27欢迎下载 set names utf8 就可以了 3 中文无乱码截取 header content type text html charset utf 8 str 的字符个数 造成无谓的 while 循环 offset length 限定 function utf8sub str len if len 0 return res offset 0 chars 0 length strlen str while chars len if strlen hign 8 count 1 elseif substr hign 0 3 110 count 2 elseif substr hign 0 4 1110 count 3 elseif substr hign 0 5 11110 count 4 精品文档 28欢迎下载 elseif substr hign 0 6 111110 count 5 elseif substr hign 0 7 1111110 count 6 res substr str offset count offset count chars 1 return res function utf8sub1 str len chars 0 res offset 0 length strlen str while chars len if strlen hign 将 t1 删除了 delimiter create trigger tri t2 update before update on t2 for each row begin delete from t1 end delimiter 示例 创建触发器 t2 delete 作用 向 t1 表添加一条记录 delimiter create trigger tri t2 delete after delete on t2 for each row begin insert into t1 values 1000 end delimiter 示例 天天新闻网 news 1 创建触发器 添加新闻 2 对新闻类别表更新 articleNums 加一 精品文档 31欢迎下载 delimiter create trigger tri newsarticles insert1 after insert on newsArticles for each row begin update newstypes set articleNums articleNums 1 where id select typeId from newsarticles where id select max id from newsarticles end delimiter 触发器里关键 NEW OLD delimiter create trigger tri newsarticles insert2 after insert on newsArticles for each row begin update newstypes set articleNums arti
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025山东日照市五莲县叩官镇招聘城乡公益性岗位人员笔试考试参考题库及答案解析
- 新教材高中数学微专题培优练十八第五章三角函数任意角和蝗制课时练习教案
- 农业创新扩散原理讲课教案
- 高一化学鲁科版必修课时元素物质的关系物质的分类教案
- 幼儿园资料大班数学教案测一测量一量(2025-2026学年)
- 生物的分类方法省公共课全国赛课获奖教案
- 高三高考总复习政治复习第九课中国共产党领导地位的确立其先进性教案
- 高中信息技术编程解决问题高中信息技术粤教版必修教案
- 高三化学教案第一章原子结构与性质知识点归纳
- 2025年伊犁州二次公开招聘中学教师(101人)笔试考试参考试题附答案解析
- 唐代诗人李白生平简介及诗词鉴赏课件教学模板
- 消除艾滋病、梅毒和乙肝母婴传播项目工作制度及流程(模板)
- MOOC 大学英语听说译-河南理工大学 中国大学慕课答案
- 爬电距离与电气间隙
- 火车过桥问题新版课件
- 《锂电池用辅助材料 第1部分 金属极耳》团体标准征求意见稿
- YS/T 886-2013纯钛型材
- 四年级《中国神话故事》测试题及答案
- 简单的轮胎供货合同范本
- DB34T3587-2020 《城镇排水管道检测与修复技术规程》
- 二年级年上(藏文)课件
评论
0/150
提交评论