分类 SQLserver 下的文章

批量替换mysql一个表中某个字段的值里面的部分字符串,使用mysql replace函数:

UPDATE prezzie_category SET image = REPLACE (image, 'http://localhost:8727','https://a.liziyu.com') where id > 0;

注意,操作之前请先备份表:

CREATE TABLE prezzie_category_bak AS SELECT * FROM prezzie_category;

在 MySQL 8.0 中,出现该错误提示是因为默认启用了 ONLY_FULL_GROUP_BY SQL 模式。这个模式要求在 GROUP BY 语句中的每个列都必须在 SELECT 列表中出现或使用聚合函数进行聚合。

要完美解决这个问题,有几种方法可以尝试:

1、将 sql_mode 设置为非严格模式:可以在会话级别或全局级别修改 sql_mode,具体取决于你的需求。以下是在会话级别进行修改的示例:

SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

注意:这个方法可能会影响其他部分的代码,因为它会禁用其他严格模式的功能。

2、为非聚合的列添加聚合函数:可以将非聚合的列添加到 GROUP BY 子句中,或者使用聚合函数对这些列进行聚合。如下所示:

SELECT column1, MAX(column2) AS max_column2
FROM table
GROUP BY column1;

根据你的具体需求,选择适当的聚合函数。

3、使用 ANY_VALUE() 函数:另一种解决方法是使用 ANY_VALUE() 函数,该函数可以在 SELECT 语句中引用非聚合列,而无需在 GROUP BY 子句中包含它们。如下所示:

SELECT column1, ANY_VALUE(column2) AS column2
FROM table
GROUP BY column1;

ANY_VALUE() 函数会返回在给定组内的任意一个值。

通常建议采用第3种方式解决。

方法一

省略了,需要修改 mysql.ini 文件,有点麻烦。

方案二

这种就简单了,直接将网站数据库配置文件中的服务器地址配置项改成127.0.0.1即可,tp6.x的位置在config/database.php

注:原因是127.0.0.1对于mysql来说,是TCP/IP连接,不会使用Unix domain socket,不会走mysql.socket。

在操作数据库时,客户端提示如下错误:

MySQL5.7.26错误问题 mysqld.exe: Error while setting value 'STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION' to 'sql_mode'

这样的问题出现,是因为MySQL的配置文件my.ini中sql_mode的值,逗号后面加上了空格导致的无法启动,需要手动删除空格就可以了。

通过谷歌搜索了一下,找到了最终的解决方案,如下:

my.ini原来部分代码:

tmp_table_size=64M
wait_timeout=120
sql_mode=STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

[client]
port=3306
default-character-set=utf8

my.ini修改后代码:

tmp_table_size=64M
wait_timeout=120
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

[client]
port=3306
default-character-set=utf8

最后,重启即可。

修改前后的比对提示,如下图:
QQ20230906-081119@2x.png

本文转自:https://xinyufeng.net/2022/03/28/

表现为:

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'tlslyzx_com.xf_orders.pay_name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

解决办法:

SELECT @@sql_mode;
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
SELECT @@sql_mode;





1、 更新十分频繁的字段上不宜建立索引:因为更新操作会变更B+树,重建索引。这个过程是十分消耗数据库性能的。
2、 区分度不大的字段上不宜建立索引:类似于性别这种区分度不大的字段,建立索引的意义不大。因为不能有效过滤数据,性能和全表扫描相当。另外返回数据的比例在30%以外的情况下,优化器不会选择使用索引。
3、 业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。虽然唯一索引会影响insert速度,但是对于查询的速度提升是非常明显的。另外,即使在应用层做了非常完善的校验控制,只要没有唯一索引,在并发的情况下,依然有脏数据产生。
4、 多表关联时,要保证关联字段上一定有索引。
5、 创建索引时避免以下错误观念:索引越多越好,认为一个查询就需要建一个索引;宁缺勿滥,认为索引会消耗空间、严重拖慢更新和新增速度;抵制唯一索引,认为业务的唯一性一律需要在应用层通过“先查后插”方式解决;过早优化,在不了解系统的情况下就开始优化。

截取转载:https://zhuanlan.zhihu.com/p/61687047

MYSQL 能支持多少连接?

MYSQL的TCP连接支持长连接,所以每次操作完数据库,可以不必直接关掉连接,而是等待下次使用的时候在复用这个连接。所有的Socket长连接都是通过TCP自带的ping来维持心跳(TCP保活),从而保持连接状态。

长连接的好处很多,自然大家都用长连接。慢慢就搞出一套长连接维护的工具 - 数据库连接池。

MYSQL 的最大连接数在5.7 - 8.x 版本中默认是151, 最大可以达到16384(2^14)。如何设置最大连接数在于你的服务器性能,查看 MYSQL连接数信息命令:
show variables like 'max_connections';

查询当前数据库已建立连接数:
show status like 'Threads_connected';

连接池设置多少连接才合适?

设置连接池的大小肯定不是越大越好,需要考虑的是当前服务所在机器的性能,网络状况,数据库机器性能,数据库特性等等。

PostgreSQL提供了一个设置预期线程池大小的公式:
connections = ((core_count * 2) + effective_spindle_count)
其中,core_count是CPU核心, effective_spindle_count 的含义是有效主轴数,如果你的服务器使用的是带有16个磁盘的RAID,那么valid_spindle_count=16。它实质上是服务器可以管理多少个并行I / O请求的度量。

5ae27afb9341438580d7264dce9646f7_tplv-obj_1062_500.png

<?php
echo date('Y-m-d H:i:s',strtotime('now'));//当前时间戳 2017-01-09 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1second'));//当前时间戳+1秒 2017-01-09 21:04:12
echo date('Y-m-d H:i:s',strtotime('+1minute'));//当前时间戳+1分 2017-01-09 21:05:11
echo date('Y-m-d H:i:s',strtotime('+1hour'));//当前时间戳+1小时 2017-01-09 22:04:11
echo date('Y-m-d H:i:s',strtotime('+1day'));//当前时间戳+1天 2017-01-10 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1week'));//当前时间戳+1周 2017-01-16 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1month'));//当前时间戳+1月 2017-02-09 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1year'));//当前时间戳+1年 2018-01-09 21:04:11
echo date('Y-m-d H:i:s',strtotime('+12year 12month 12day 12hour 12minute 12second'));//当前时间戳+12年,12月,12天,12小时,12分,12秒 2030-01-22 09:16:23
$t=1483967416;//指定时间戳
echo $dt=date('Y-m-d H:i:s',$t);//2017-01-09 21:10:16
/*方法一*/
echo date('Y-m-d H:i:s',$t+1*24*60*60);//指定时间戳+1天 2017-01-10 21:10:16
echo date('Y-m-d H:i:s',$t+365*24*60*60);//指定时间戳+1年 2018-01-09 21:10:16
/*方法二*/
//$dt是指定时间戳格式化后的日期
echo date('Y-m-d H:i:s',strtotime("$dt+1day"));//指定时间戳+1天 2017-01-10 21:10:16
echo date('Y-m-d H:i:s',strtotime("$dt+1year"));//指定时间戳+1年 2018-01-09 21:10:16
/*方法三*/
//$t是指定时间戳
echo date('Y-m-d H:i:s',strtotime("+1day",$t));//指定时间戳+1天 2017-01-10 21:10:16
echo date('Y-m-d H:i:s',strtotime("+1year",$t));//指定时间戳+1年 2018-01-09 21:10:16
//指定时间戳加1月、1周、1小时、1分、1秒原理同上;

1.数据查询语言(DQL)

数据查询语言(Data Query Language, DQL)保留字SELECTFROMWHEREGROUP BYHAVINGORDER BY(查询操作)。

2.数据定义语言(DDL)

数据定义语言 (Data Definition Language, DDL) CREATEALTERDROP三个语法所组成(对表结构操作)。

3.数据操纵语言(DML)

数据操纵语言(Data Manipulation Language, DMLINSERTUPDATEDELETE三种指令为核心(对表内数据操作)。

4.数据控制语言(DCL)

数据控制语言 (Data Control Language) 由 GRANTREVOKE 两个指令组成(权限管理)。

5.指针控制语言(CCL)

它的语句,像DECLARE CURSORFETCH INTOUPDATE WHERE CURRENT用于对一个或多个表单独行的操作。

6.事务处理语言(TPL)

包括BEGIN TRANSACTIONCOMMITROLLBACK(事务控制)。