mysql常见问题集合:
1.mysql中文排序:
字段编码为utf8时,mysql并不会按中文拼音排序。
需要设置字段编码为gbk,或对字段进行类型转换CONVERT([字段] using gbk)
比如: select * from table order by CONVERT(nameUSING gbk)
2.在mysql中的group_concat函数限制:
在mysql中的group_concat函数默认支持的最大字符数为1024。
当你使用group_concat函数时,超出第1024字符的字符会全部丢失。
解决方法:
(1).使用sql设置group_concat的最大长度
SET GLOBAL group_concat_max_len=102400;
SET SESSION group_concat_max_len=102400;
但是这种方式在重启mysql后就无效。
(2).在MySQL配置文件中my.conf或my.ini中添加:
#[mysqld]
group_concat_max_len=102400
然后重启mysql服务
3.ONLY_FULL_GROUP_BY校验规则导致group by 报语法错误
--关闭only_full_group_by的规则校验
set @@GLOBAL.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
set @@SESSION.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
在 [mysqld] 下面添加代码:
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
4.数据库表名的大小写配置
show global variables like '%lower_case_table_names%';
lower_case_table_names = 0时,mysql会根据表名直接操作,大小写敏感。
lower_case_table_names = 1时,mysql会先把表名转为小写,再执行操作。
找出mysql的配置文件,在 [mysqld] 下面添加/修改代码,
修改 lower_case_table_names = 1
即可以不区分大小写了
其他
事务的四大特性(ACID): 原子性,一致性,隔离性,持久性
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ-UNCOMMITTED | √ | √ | √ |
READ-COMMITTED | × | √ | √ |
REPEATABLE-READ | × | × | √ |
SERIALIZABLE | × | × | × |
mysql为第3种 REPEATABLE-READ
mysql外键优缺点:
优点:便于查看各个表的关系,增强数据可靠性。
缺点:在进行insert, update, delete等操作时,会校验数据是否符合,导致耗时过大。
索引方法(结构): B树/ B+树 (BTree)(常用) hash
一级索引(聚集索引):
主键索引:在 MySQL 的 InnoDB 的表中,当没有显示的指定表的主键时,InnoDB 会自动先检查表中是否
有唯一索引的字段,如果有,则选择该字段为默认的主键,否则 InnoDB 将会自动创建一个 6Byte 的自增主键。主键索引只能有一个。添加多个主键会变成复合索引。
二级索引(非聚集索引)
普通索引(index)
唯一索引(Unique Key)
全文索引(Full Text)
单一索引:针对单列的索引
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
复合(联合)索引:针对多列的索引,有优先级,筛选力度最高的放最前面
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )