本文档风哥主要介绍MariaDB的字符集和时区配置,以及数据库初始化规范,包括字符集选择、时区设置、数据库初始化步骤等内容。风哥教程参考MariaDB官方文档Character Sets and Collations、Time Zones内容,适合数据库管理员学习和实施。
Part01-基础概念与理论知识
1.1 字符集概述
字符集是一套符号和编码的集合,MariaDB支持多种字符集,包括:
- ASCII:基本拉丁字符集
- UTF-8:通用多语言字符集
- GBK:中文编码字符集
- Latin1:西欧字符集
1.2 时区概述
时区是指地球上不同区域使用的时间标准,MariaDB支持:
- 系统时区
- 数据库时区
- 会话时区
1.3 初始化规范
数据库初始化规范包括:
- 字符集和校对规则设置
- 时区设置
- 用户和权限管理
- 参数配置
- 安全设置
更多视频教程www.fgedu.net.cn
Part02-生产环境规划与建议
2.1 字符集选择
风哥提示:生产环境建议使用UTF-8字符集,以支持多语言和国际化需求。
2.2 时区配置
时区配置建议:
- 使用UTC时区作为数据库默认时区
- 应用程序层面处理时区转换
- 确保服务器时区设置正确
2.3 初始化规划
初始化规划包括:
- 数据库命名规范
- 用户命名规范
- 表命名规范
- 索引命名规范
- 参数配置规范
学习交流加群风哥微信: itpux-com
Part03-生产环境项目实施方案
3.1 字符集配置
更多学习教程公众号风哥教程itpux_com
# 配置字符集
[root@fgedu.net.cn ~]# cat >> /etc/my.cnf << 'EOF'
# 字符集配置
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init-connect = ‘SET NAMES utf8mb4’
skip-character-set-client-handshake
EOF
# 重启服务
[root@fgedu.net.cn ~]# systemctl restart mariadb
# 验证字符集配置
[root@fgedu.net.cn ~]# mysql -u root -p
Enter password:
MariaDB [(none)]> SHOW VARIABLES LIKE ‘%character%’;
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+————————–+—————————-+
MariaDB [(none)]> SHOW VARIABLES LIKE ‘%collation%’;
+———————-+——————–+
| Variable_name | Value |
+———————-+——————–+
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
+———————-+——————–+
[root@fgedu.net.cn ~]# cat >> /etc/my.cnf << 'EOF'
# 字符集配置
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init-connect = ‘SET NAMES utf8mb4’
skip-character-set-client-handshake
EOF
# 重启服务
[root@fgedu.net.cn ~]# systemctl restart mariadb
# 验证字符集配置
[root@fgedu.net.cn ~]# mysql -u root -p
Enter password:
MariaDB [(none)]> SHOW VARIABLES LIKE ‘%character%’;
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+————————–+—————————-+
MariaDB [(none)]> SHOW VARIABLES LIKE ‘%collation%’;
+———————-+——————–+
| Variable_name | Value |
+———————-+——————–+
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
+———————-+——————–+
3.2 时区设置
# 检查系统时区
[root@fgedu.net.cn ~]# timedatectl
Local time: Mon 2026-04-07 15:00:00 CST
Universal time: Mon 2026-04-07 07:00:00 UTC
RTC time: Mon 2026-04-07 07:00:00
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
systemd-timesyncd.service active: yes
RTC in local TZ: no
# 安装时区数据
[root@fgedu.net.cn ~]# mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Enter password:
# 配置数据库时区
[root@fgedu.net.cn ~]# cat >> /etc/my.cnf << 'EOF'
# 时区配置
default-time-zone = ‘+08:00’
EOF
# 重启服务
[root@fgedu.net.cn ~]# systemctl restart mariadb
# 验证时区配置
[root@fgedu.net.cn ~]# mysql -u root -p
Enter password:
MariaDB [(none)]> SHOW VARIABLES LIKE ‘%time_zone%’;
+——————+——–+
| Variable_name | Value |
+——————+——–+
| system_time_zone | CST |
| time_zone | +08:00 |
+——————+——–+
MariaDB [(none)]> SELECT NOW();
+———————+
| NOW() |
+———————+
| 2026-04-07 15:05:00 |
+———————+
[root@fgedu.net.cn ~]# timedatectl
Local time: Mon 2026-04-07 15:00:00 CST
Universal time: Mon 2026-04-07 07:00:00 UTC
RTC time: Mon 2026-04-07 07:00:00
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
systemd-timesyncd.service active: yes
RTC in local TZ: no
# 安装时区数据
[root@fgedu.net.cn ~]# mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Enter password:
# 配置数据库时区
[root@fgedu.net.cn ~]# cat >> /etc/my.cnf << 'EOF'
# 时区配置
default-time-zone = ‘+08:00’
EOF
# 重启服务
[root@fgedu.net.cn ~]# systemctl restart mariadb
# 验证时区配置
[root@fgedu.net.cn ~]# mysql -u root -p
Enter password:
MariaDB [(none)]> SHOW VARIABLES LIKE ‘%time_zone%’;
+——————+——–+
| Variable_name | Value |
+——————+——–+
| system_time_zone | CST |
| time_zone | +08:00 |
+——————+——–+
MariaDB [(none)]> SELECT NOW();
+———————+
| NOW() |
+———————+
| 2026-04-07 15:05:00 |
+———————+
3.3 数据库初始化
# 创建数据库(指定字符集)
[root@fgedu.net.cn ~]# mysql -u root -p
Enter password:
MariaDB [(none)]> CREATE DATABASE fgedudb
-> CHARACTER SET utf8mb4
-> COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.00 sec)
# 创建用户
MariaDB [(none)]> CREATE USER ‘fgedu’@’fgedu.localhost’ IDENTIFIED BY ‘YourStrongPassword!123’;
Query OK, 0 rows affected (0.00 sec)
# 授权
MariaDB [(none)]> GRANT ALL PRIVILEGES ON fgedudb.* TO ‘fgedu’@’fgedu.localhost’;
Query OK, 0 rows affected (0.00 sec)
# 创建测试表(指定字符集)
MariaDB [(none)]> USE fgedudb;
Database changed
MariaDB [fgedudb]> CREATE TABLE fgedu_users (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(50) CHARACTER SET utf8mb4,
-> email VARCHAR(100) CHARACTER SET utf8mb4,
-> created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
Query OK, 0 rows affected (0.01 sec)
# 插入测试数据
MariaDB [fgedudb]> INSERT INTO fgedu_users (name, email) VALUES
-> (‘张三’, ‘zhangsan@fgedu.net.cn’),
-> (‘李四’, ‘lisi@fgedu.net.cn’),
-> (‘王五’, ‘wangwu@fgedu.net.cn’);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
[root@fgedu.net.cn ~]# mysql -u root -p
Enter password:
MariaDB [(none)]> CREATE DATABASE fgedudb
-> CHARACTER SET utf8mb4
-> COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.00 sec)
# 创建用户
MariaDB [(none)]> CREATE USER ‘fgedu’@’fgedu.localhost’ IDENTIFIED BY ‘YourStrongPassword!123’;
Query OK, 0 rows affected (0.00 sec)
# 授权
MariaDB [(none)]> GRANT ALL PRIVILEGES ON fgedudb.* TO ‘fgedu’@’fgedu.localhost’;
Query OK, 0 rows affected (0.00 sec)
# 创建测试表(指定字符集)
MariaDB [(none)]> USE fgedudb;
Database changed
MariaDB [fgedudb]> CREATE TABLE fgedu_users (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(50) CHARACTER SET utf8mb4,
-> email VARCHAR(100) CHARACTER SET utf8mb4,
-> created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
Query OK, 0 rows affected (0.01 sec)
# 插入测试数据
MariaDB [fgedudb]> INSERT INTO fgedu_users (name, email) VALUES
-> (‘张三’, ‘zhangsan@fgedu.net.cn’),
-> (‘李四’, ‘lisi@fgedu.net.cn’),
-> (‘王五’, ‘wangwu@fgedu.net.cn’);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
学习交流加群风哥QQ113257174
Part04-生产案例与实战讲解
4.1 字符集配置实战
# 测试中文字符
MariaDB [fgedudb]> SELECT * FROM fgedu_users;
+—-+——–+———————-+———————+
| id | name | email | created_at |
+—-+——–+———————-+———————+
| 1 | 张三 | zhangsan@fgedu.net.cn | 2026-04-07 15:10:00 |
| 2 | 李四 | lisi@fgedu.net.cn | 2026-04-07 15:10:00 |
| 3 | 王五 | wangwu@fgedu.net.cn | 2026-04-07 15:10:00 |
+—-+——–+———————-+———————+
3 rows in set (0.00 sec)
# 测试特殊字符
MariaDB [fgedudb]> INSERT INTO fgedu_users (name, email) VALUES
-> (‘José García’, ‘jose@fgedu.net.cn’),
-> (‘田中太郎’, ‘tanaka@fgedu.net.cn’),
-> (‘Иван Иванов’, ‘ivan@fgedu.net.cn’);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
MariaDB [fgedudb]> SELECT * FROM fgedu_users WHERE id > 3;
+—-+—————+———————-+———————+
| id | name | email | created_at |
+—-+—————+———————-+———————+
| 4 | José García | jose@fgedu.net.cn | 2026-04-07 15:15:00 |
| 5 | 田中太郎 | tanaka@fgedu.net.cn | 2026-04-07 15:15:00 |
| 6 | Иван Иванов | ivan@fgedu.net.cn | 2026-04-07 15:15:00 |
+—-+—————+———————-+———————+
3 rows in set (0.00 sec)
MariaDB [fgedudb]> SELECT * FROM fgedu_users;
+—-+——–+———————-+———————+
| id | name | email | created_at |
+—-+——–+———————-+———————+
| 1 | 张三 | zhangsan@fgedu.net.cn | 2026-04-07 15:10:00 |
| 2 | 李四 | lisi@fgedu.net.cn | 2026-04-07 15:10:00 |
| 3 | 王五 | wangwu@fgedu.net.cn | 2026-04-07 15:10:00 |
+—-+——–+———————-+———————+
3 rows in set (0.00 sec)
# 测试特殊字符
MariaDB [fgedudb]> INSERT INTO fgedu_users (name, email) VALUES
-> (‘José García’, ‘jose@fgedu.net.cn’),
-> (‘田中太郎’, ‘tanaka@fgedu.net.cn’),
-> (‘Иван Иванов’, ‘ivan@fgedu.net.cn’);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
MariaDB [fgedudb]> SELECT * FROM fgedu_users WHERE id > 3;
+—-+—————+———————-+———————+
| id | name | email | created_at |
+—-+—————+———————-+———————+
| 4 | José García | jose@fgedu.net.cn | 2026-04-07 15:15:00 |
| 5 | 田中太郎 | tanaka@fgedu.net.cn | 2026-04-07 15:15:00 |
| 6 | Иван Иванов | ivan@fgedu.net.cn | 2026-04-07 15:15:00 |
+—-+—————+———————-+———————+
3 rows in set (0.00 sec)
4.2 时区配置实战
# 测试时区
MariaDB [(none)]> SELECT NOW(), UTC_TIMESTAMP();
+———————+———————+
| NOW() | UTC_TIMESTAMP() |
+———————+———————+
| 2026-04-07 15:20:00 | 2026-04-07 07:20:00 |
+———————+———————+
# 测试时区转换
MariaDB [(none)]> SELECT CONVERT_TZ(NOW(), ‘+08:00’, ‘+00:00’);
+—————————————+
| CONVERT_TZ(NOW(), ‘+08:00’, ‘+00:00’) |
+—————————————+
| 2026-04-07 07:20:00 |
+—————————————+
# 会话级别时区设置
MariaDB [(none)]> SET time_zone = ‘+00:00’;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> SELECT NOW();
+———————+
| NOW() |
+———————+
| 2026-04-07 07:21:00 |
+———————+
# 恢复默认时区
MariaDB [(none)]> SET time_zone = ‘+08:00’;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> SELECT NOW();
+———————+
| NOW() |
+———————+
| 2026-04-07 15:21:00 |
+———————+
MariaDB [(none)]> SELECT NOW(), UTC_TIMESTAMP();
+———————+———————+
| NOW() | UTC_TIMESTAMP() |
+———————+———————+
| 2026-04-07 15:20:00 | 2026-04-07 07:20:00 |
+———————+———————+
# 测试时区转换
MariaDB [(none)]> SELECT CONVERT_TZ(NOW(), ‘+08:00’, ‘+00:00’);
+—————————————+
| CONVERT_TZ(NOW(), ‘+08:00’, ‘+00:00’) |
+—————————————+
| 2026-04-07 07:20:00 |
+—————————————+
# 会话级别时区设置
MariaDB [(none)]> SET time_zone = ‘+00:00’;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> SELECT NOW();
+———————+
| NOW() |
+———————+
| 2026-04-07 07:21:00 |
+———————+
# 恢复默认时区
MariaDB [(none)]> SET time_zone = ‘+08:00’;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> SELECT NOW();
+———————+
| NOW() |
+———————+
| 2026-04-07 15:21:00 |
+———————+
4.3 初始化规范实战
# 数据库初始化脚本
[root@fgedu.net.cn ~]# cat > init_database.sh << 'EOF'
#!/bin/bash
# init_database.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 数据库配置
DB_NAME=”fgedudb”
DB_USER=”fgedu”
DB_PASS=”YourStrongPassword!123″
# 创建数据库
mysql -u root -p << EOF
CREATE DATABASE IF NOT EXISTS $DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER IF NOT EXISTS ‘$DB_USER’@’fgedu.localhost’ IDENTIFIED BY ‘$DB_PASS’;
GRANT ALL PRIVILEGES ON $DB_NAME.* TO ‘$DB_USER’@’fgedu.localhost’;
FLUSH PRIVILEGES;
EOF
echo “数据库初始化完成!”
EOF
# 执行初始化脚本
[root@fgedu.net.cn ~]# chmod +x init_database.sh
[root@fgedu.net.cn ~]# ./init_database.sh
Enter password:
database initialization completed!
# 验证初始化结果
[root@fgedu.net.cn ~]# mysql -u fgedu -p$DB_PASS -e “SHOW DATABASES;
”
+——————–+
| Database |
+——————–+
| information_schema |
| fgedudb |
+——————–+
[root@fgedu.net.cn ~]# cat > init_database.sh << 'EOF'
#!/bin/bash
# init_database.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 数据库配置
DB_NAME=”fgedudb”
DB_USER=”fgedu”
DB_PASS=”YourStrongPassword!123″
# 创建数据库
mysql -u root -p << EOF
CREATE DATABASE IF NOT EXISTS $DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER IF NOT EXISTS ‘$DB_USER’@’fgedu.localhost’ IDENTIFIED BY ‘$DB_PASS’;
GRANT ALL PRIVILEGES ON $DB_NAME.* TO ‘$DB_USER’@’fgedu.localhost’;
FLUSH PRIVILEGES;
EOF
echo “数据库初始化完成!”
EOF
# 执行初始化脚本
[root@fgedu.net.cn ~]# chmod +x init_database.sh
[root@fgedu.net.cn ~]# ./init_database.sh
Enter password:
database initialization completed!
# 验证初始化结果
[root@fgedu.net.cn ~]# mysql -u fgedu -p$DB_PASS -e “SHOW DATABASES;
”
+——————–+
| Database |
+——————–+
| information_schema |
| fgedudb |
+——————–+
风哥提示:安全开发是防止SQL注入的第一道防线
Part05-风哥经验总结与分享
5.1 常见问题与解决
- 字符集乱码:确保客户端和服务器字符集一致
- 时区不一致:统一配置数据库和应用程序时区
- 初始化失败:检查权限和配置文件
- 特殊字符存储:使用utf8mb4字符集
5.2 最佳实践
风哥提示:生产环境应在数据库初始化时就配置好字符集和时区,避免后期修改带来的问题。
5.3 规范检查清单
- 字符集设置为utf8mb4
- 校对规则设置为utf8mb4_general_ci
- 时区设置正确
- 用户权限设置合理
- 数据库命名符合规范
- 表和字段命名符合规范
from MariaDB视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
