赞
踩
mysql> show variables like '%lower_case_table_names%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_table_names | 0 |
+------------------------+-------+
1 row in set (0.00 sec)
lower_case_table_names 参数的设置:
$ vim /etc/my.cof
# 在 [mysqld] 加入
lower_case_table_names=1
当想要设置为大小写不敏感时, 要在 my.cnf
这个配置文件的 [mysqld]
中加入 lower_case_table_names=1
, 然后重启服务。
但是,要在重启数据库实例前就需要将原来的数据库和表转换为小写,否则将找不到数据库名。
此参数适用于 MySQL5.7。在 MySQL8 下禁止在重新启动 MySQL 时将 lower_case_table_names
设置成不同于初始化MySQL 服务时设置的 lower_case_table_names
值。 如果非要将 MySQL8 设置为大小写不敏感,具体步骤为:
/var/lib/mysql
目录;/etc/my.cnf
中添加 lower_case_table_names=1
在 MySQL8 之前,默认字符集为 latin1
,utf 字符集指向的是 utfmb3
。如果管理员忘记修改默认的字符集,就会出现乱码的问题。从 MySQL8 开始,数据库的默认编码改为了 utfbmb4
, 从而避免乱码问题。
注意: 此处 MySQL5 和 MySQL8 都是通过 docker 安装, 版本如下: mysql:5.7
、mysql:8.0
-- mysql5.7 mysql> show variables like '%character%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ -- mysql8 mysql> show variables like '%character%'; +--------------------------+--------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | utf8mb4 | | character_set_system | utf8mb3 | | character_sets_dir | /usr/share/mysql-8.0/charsets/ | +--------------------------+--------------------------------+
在 MySQL5 中, character_set_server
和 character_set_database
都是 latin1
,不支持中文,保存中文会报错
mysql> create database kinodb1; Query OK, 1 row affected (0.00 sec) mysql> use kinodb1 Database changed mysql> create table test1(id int primary key auto_increment, name varchar(25)); Query OK, 0 rows affected (0.04 sec) mysql> insert into test1 values(0, '我爱中国'); [HY000][1366] Incorrect string value: '\xE6\x88\x91\xE7\x88\xB1...' for column 'name' at row 1 -- 查看建表语句 +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ | test1 | CREATE TABLE `test1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(25) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 | +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) -- 查看建库语句 mysql> show create database kinodb1; +----------+--------------------------------------------------------------------+ | Database | Create Database | +----------+--------------------------------------------------------------------+ | kinodb1 | CREATE DATABASE `kinodb1` /*!40100 DEFAULT CHARACTER SET latin1 */ | +----------+--------------------------------------------------------------------+ 1 row in set (0.00 sec)
$ vim /etc/my.cnf [mysql] default-character-set=utf8 [client] default-character-set=utf8 [mysqld] character_set_server=utf8 -- 重启 MySQL # 再次查看字符集(MySQL5) mysql> SHOW VARIABLES LIKE 'character%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)
此修改只会针对重启数据库后的后续新建操作生效,历史的误会变更。
-- 修改已存在的数据库字符集
alter database kinodb1 character set 'utf8';
-- 修改已存在的表字符集
alter table test1 convert to character set 'utf8';
原来的数据如果使用非 utf8 编码的话,数据本身编码不会发生改变。已有数据需要导出或者删除,然后重新插入。
$ vim /etc/my.cnf
[mysqld]
...
max_connections=1000
# 查看最大连接数
show variables like '%max_connections%';
# 查看当前连接数
show status like 'Threads%';
SET PASSWORD FOR 'root'@'localhost'= "Kino123.";
max_allowed_packet
是指 mysql server 和 client 在一次传送数据包的过程中最大允许的数据包大小.
# 临时修改
set global max_allowed_packet = 64 * 1024 * 1024;
# 永久修改
vim my.ini
[mysqld]
max_allowed_packet = 64M
# 查询
show VARIABLES like '%max_allowed_packet%';
-- 三种方式都可以
mysql> select @@session.sql_mode;
mysql> select @@global.sql_mode;
mysql> show variables like 'sql_mode';
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@session.sql_mode |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
set global sql_mode = '...'; -- 全局
set session sql_mode = '...'; -- 当前会话
-- 示例
-- 改为严格模式。在当前会话中生效,关闭当前会话就生效了
set session sql_mode = 'STRICT_TRANS_TABLES';
-- 改为严格模式。在当前服务中生效,重启 MySQL 服务后就失效了
set global sql_mode = 'STRICT_TRANS_TABLES';
修改 /etc/my.cnf
设置
[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
如果设置的是宽松模式,那么在插入数据的时候,即便是给了一个错误的数据,也可以被接收,并且不报错。
-- 设置宽松模式 set session sql_mode = ''; -- 创建表 create table test2(id int primary key auto_increment, name varchar(5)); -- insert 记录 insert into test2 values(0, 'abcde123'); -- 查询记录可以看见,name限制为5字符, insert8字符, 实际被截断了,过程中没有异常信息 select * from test2; +----+-------+ | id | name | +----+-------+ | 1 | abcde | +----+-------+ 1 row in set (0.00 sec)
MySQL5.7 版本就将 sql_mode 默认值改为了严格模式。
-- 设置严格模式
set session sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
-- insert 记录会报错
insert into test2 values(0, 'abcde123');
ERROR 1406 (22001): Data too long for column 'name' at row 1
ONLY_FULL_GROUP_BY
: 对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么将认为这个SQL是不合法的,因为列不在GROUP BY从句中.STRICT_TRANS_TABLES
: 在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做任何限制NO_ZERO_IN_DATE
: 在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入’0000-00-00’。在非严格模式,可以接受该日期,但会生成警告。NO_ZERO_DATE
: 在严格模式,不要将 '0000-00-00’做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告。ERROR_FOR_DIVISION_BY_ZERO
: 在严格模式,在INSERT或UPDATE过程中,如果被零除(或MOD(X,0)),则产生错误(否则为警告)。如果未给出该模式,被零除时MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作结果为NULL。NO_AUTO_CREATE_USER
: 防止GRANT自动创建新用户,除非还指定了密码。NO_ENGINE_SUBSTITUTION
: 如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常。ANSI
: 宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告。TRADITIONAL
: 严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误。用于事务时,会进行事务的回滚。STRICT_TRANS_TABLES
: 严格模式,进行数据的严格校验,错误数据不能插入,报error错误。-- 查看数据库默认引擎
mysql> show engines;
-- 设置默认引擎(临时)
mysql> set default_storage_engine=InnoDB;
-- 设置默认引擎(永久)
[mysqld]
default-storage-engine=InnoDB
## 在服务器输入
export LANG=en_US.UTF-8
## 再次进入mysql, 即可输入中文
mysql -uroot -p
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。