ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxxxxx';
月度归档: 2025 年 1 月
Windows 批处理脚本脚本连接mariadb时,配置数据库字符集
在通过命令行执行数据库脚本时,遇到错误:Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (gbk_chinese_ci,COERCIBLE) for operation '='
解决办法:
可以通过 --default-character-set=utf8mb4 参数来配置连接所用的默认字符集来解决,例如下面的数据库升级脚本:
@echo off
"C:\Program Files\MariaDB 10.6\bin\mysql" -uroot -p123456 -Dworksummarynet --default-character-set=utf8mb4 < ./upgrade.sql
echo Database upgrade completed!
pause
mariadb创建数据库时指定编码
在MariaDB中,创建数据库时,你可以指定数据库的字符编码(Character Set)和排序规则(Collation)。字符编码决定了数据库可以存储哪些字符,而排序规则则决定了字符的排序方式。这对于确保数据库能够正确处理多语言数据和特殊字符至关重要。
本文将介绍如何在创建数据库时指定字符编码和排序规则。
为什么要指定字符编码?
- 支持多语言数据:不同的编码支持不同的字符集。例如,如果你需要存储多语言数据,UTF-8编码(尤其是
utf8mb4)是最合适的选择,因为它可以兼容大部分常见的字符集,支持包括表情符号(emoji)在内的特殊字符。 - 数据一致性:指定字符编码可以确保在数据库操作中字符不会丢失或被错误解析,避免出现乱码。
- 优化查询和排序:使用合适的排序规则可以优化查询速度和排序准确性,特别是当你需要对字符进行排序时。
步骤1:创建数据库时指定字符编码和排序规则
在MariaDB中,可以使用CREATE DATABASE语句来创建数据库时指定字符编码和排序规则。以下是两个常见的例子:
示例 1:创建使用UTF-8编码的数据库
CREATE DATABASE test
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
解释:
utf8mb4是一种UTF-8字符编码,支持所有Unicode字符,包括表情符号等特殊字符。utf8mb4_general_ci是常用的排序规则,ci表示不区分大小写(Case Insensitive)。在此排序规则下,A和a会被认为是相同的字符。- 该语句创建了一个名为
test的数据库,并指定了utf8mb4字符编码和utf8mb4_general_ci排序规则。
示例 2:创建使用UTF-8编码的数据库
CREATE DATABASE blog
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci;
解释:
utf8是MariaDB较早版本支持的UTF-8编码,能够存储多语言字符,但不支持一些Unicode字符(如某些表情符号)。utf8_general_ci是utf8字符集的默认排序规则,也是不区分大小写的排序规则。- 该语句创建了一个名为
blog的数据库,使用了utf8字符编码和utf8_general_ci排序规则。
步骤2:检查数据库的字符编码和排序规则
创建数据库之后,可以使用以下SQL语句检查数据库的当前字符编码和排序规则:
SHOW CREATE DATABASE test;
输出示例:
+----------+------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------+
| test | CREATE DATABASE `test` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci |
+----------+------------------------------------------------------------+
这会显示你所创建数据库的字符编码和排序规则,确认是否与预期一致。
字符编码与排序规则的选择
- utf8mb4:推荐用于所有支持Unicode字符的场景,特别是当你需要存储多语言内容或特殊符号(如表情符号)时。它是一个更完备的UTF-8编码。
- utf8:适用于普通的多语言数据,但不支持某些Unicode字符,尤其是表情符号。建议仅在无法使用
utf8mb4时选择它。 - utf8_general_ci 与 utf8mb4_general_ci:这些是最常用的排序规则,适用于一般的文本排序。
ci表示不区分大小写。 - utf8_unicode_ci 与 utf8mb4_unicode_ci:这些排序规则支持更精确的Unicode字符排序,适用于需要对字符进行精确排序的场景(例如,区分重音符号等)。
步骤3:修改已创建数据库的字符编码和排序规则
如果已经创建的数据库没有使用你想要的字符编码或排序规则,你可以使用ALTER DATABASE语句来更改:
ALTER DATABASE test
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
这将更改test数据库的字符编码和排序规则为utf8mb4和utf8mb4_general_ci。
注意事项
- 兼容性:在选择字符编码时,请确保与当前的数据兼容。例如,
utf8mb4比utf8消耗更多存储空间,因此在选择编码时要考虑到存储要求。 - 迁移问题:如果你修改了已存在数据库的字符编码,需要小心数据迁移,确保数据不会因为编码不一致而丢失或变乱码。
- 数据库性能:不同的字符编码和排序规则可能会影响数据库的性能。建议在高并发环境下做性能测试,确保选择的字符集和排序规则不会影响数据库查询的速度。
结论
通过在创建MariaDB数据库时指定字符编码和排序规则,可以确保数据库能够正确处理多语言数据并优化查询性能。推荐使用utf8mb4字符编码,因为它支持更广泛的Unicode字符,特别是表情符号等特殊字符。在进行数据库设计时,务必根据应用需求选择适合的字符集和排序规则,确保数据的一致性与兼容性。
--创建数据库时指定编码
create database test default character set utf8mb4 collate utf8mb4_general_ci;
create database blog default character set utf8 collate utf8_general_ci;
centos mariadb 配置忽略大小写
编辑配置文件:vi /etc/my.cnf,在[mysqld]下面添加lower_case_table_names=1, 保存后,重启mariadb即可。
重启mariadb:
systemctl restart mariadb
nginx https配置模板
server {
listen 443 ssl http2 default_server;
server_name notes.wujie.me;
root /var/www/notes.wujie.me;
index index.html index.htm index.php;
#文件上传大小限制 必须要放在server下的server_name下
client_max_body_size 200m;
# 因为是默认的 https 站点,所以有可能是从 IP 进来的请求,那么把它跳转到域名
if ($host != 'notes.wujie.me) {
rewrite ^/(.*)$ https://notes.wujie.me/$1 permanent;
break;
}
ssl_certificate /etc/nginx/ssl/notes.wujie.me.pem;
ssl_certificate_key /etc/nginx/ssl/notes.wujie.me.key;
#加上TLSv1,HTTPS检测会报PCI DSS不合规
ssl_protocols TLSv1.2 TLSv1.3;# Requires nginx >= 1.13.0 else use TLSv1.2
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
location / {
try_files $uri $uri/ /index.php?$args;
}
# pass PHP scripts to FastCGI server
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
}
Nginx PHP 配置模板
server {
listen 80;
root /var/www/www.example.com;
# Add index.php to the list if you are using PHP
index index.html index.htm index.php index.nginx-debian.html;
server_name www.example.com;
client_max_body_size 20m;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php-fpm (or other unix sockets):
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
}
wordpress之WP_Query函数
用法一、查询某一分类下的文章,代码如下:
<?php
$query = new WP_Query([
'post_type' => 'product', // 文章类型是自定义类型 product
'posts_per_page' => 999, // 每页 999 条
'order' => 'ASC', // 升序排序
// 查询分类,即该自定义类型下的分类
'tax_query' => [
[
// 分类的名字
'taxonomy' => 'product_category',
// 根据wp_terms表里的哪个字段进行查询,可以根据term_id或slug等
'field' => 'term_id',
// 上面字段的值
'terms' => $sub->term_id,
]
],
]);
if ($query->have_posts()) :
while ($query->have_posts()) :
$query->the_post();
?>
<a href="<?php the_permalink() ?>"><?php the_title() ?></a>
<?php
endwhile;
endif;
// 使用 WP_Query 查询后,不要忘了进行重置查询,否则会影响后面代码的执行
wp_reset_query();
?>
wordpress之wp_list_categories函数
该函数用来输出一个某个分类法下的分类列表,输出的是html格式,默认是 <li>…</li>
$term = get_term_by('slug', 'software', 'product_category');
wp_list_categories([
'taxonomy' => 'product_category', // 分类法
'child_of' => $term->term_id, // 哪个分类的子分类
'depth' => 0,
'hide_empty'=>false, // 如果该分类下没有文章,是否隐藏
'title_li' => ''
] );
wordpress之the_xxx 系列的函数
该系列函数主要用于对单篇文章使用,获取单篇文章的相关信息,常用函数如下:
输出文章标题
<?php the_title() ?>
输出文章发布时间
<?php echo get_the_date( 'Y-m-d' ); ?>
输出文章简介,超出的部分用[…]来省略。
<?php the_excerpt(); ?>
输出文章的固定链接
<?php the_permalink() ?>
输出文章内容
<?php the_content() ?>
wordpress之sanitize_text_field函数
清理用户输入或者从数据库中获取的字符串。
检查是否合法的 UTF-8 字符,将 < 转换成 HTML 实体,去掉所有标签,删除所有换行符,占位符,以及额外的空格,去掉八位字节。
常用于后台meta box 保存内容时,但是使用了wp_editor就不能使用该函数进行过滤了,否则会导致生成的富文本格式不正确。
用法:
<?php sanitize_text_field($string); ?>
函数所在文件:wp-includes/formatting.php
参考:https://blog.wpjam.com/function_reference/sanitize_text_field/