标签: Mysql

MySQL 1000 万数据如何*快全量迁移?

自建的数据库(大概 1000 万条数据,2M 带宽),现在想迁移到阿里云的 RDS 上,如何用*少的时间迁移过去?

用了阿里云的数据迁移服务 DTS,非常的慢,而且一度把源服务器上的带宽占满,导致整个网站挂了。

问一问,大家有没有比较好的解决方法呢?

迁移 带宽 MySQL RDS23 条回复 • 2021-10-12 10:58:38 +08:00
taobibi 1
taobibi 19 小时 4 分钟前
虽然没解答,水 1 楼
https://v2ex.com/t/806269
我这边要迁移几千万个图片现在还在犯愁中
blackeeper 2
blackeeper 18 小时 59 分钟前
在阿里云的服务器上建一个从库,怎么迁移都没问题,又不影响你自建的主库
xiao109 3
xiao109 18 小时 55 分钟前
本地先切成小库,再分批迁移过去
blue7wings 4
blue7wings 18 小时 48 分钟前
@blackeeper 建立一个从库,历史数据还是要导入过去的吧,我现在想直接把这部分数据导入过去就可以了。
blackeeper 5
blackeeper 18 小时 41 分钟前
@blue7wings 你这个问题就是限速,避免影响现有的服务呗。你可以导出 SQL,然后压缩、用 rsync 限速传输到阿里云服务器就可以了
myd 6
myd 18 小时 3 分钟前
1. 导出 SQL 文件
2. 导入到新库
3. 配置主从(新库为从库)
4. 等到主从延迟为 0 的时候,停掉业务服务器
5. 应用这边切换数据库到新库
6. 启动业务
Xusually 7
Xusually 17 小时 38 分钟前
1 、做好方案,操作顺序捋清楚。
2 、临时升级带宽到满足迁移需要。
3 、迁移。
4 、带宽回退到 2M 。

花不了多少钱。
gengchun 8
gengchun 16 小时 19 分钟前
PB 一级的话,可以考虑阿里的离线迁移服务。比这小的话,其实可以试试看。*少也要几 TB 吧。

当然,没有到 TB,还是直接升带宽吧。
defunct9 9
defunct9 15 小时 35 分钟前 via iPhone
很简单啊,做主从。慢慢来就行了
netnr 10
netnr 15 小时 19 分钟前 via Android
开一台同区域的临时宽带按量计费的机子,再做端口转发
bing0 11
bing0 15 小时 16 分钟前
添加一块网卡 1G,好像可以找客服申请 5G 口,按量付费,迁移完后删除。
moult 12
moult 15 小时 9 分钟前
自建的数据库的服务商有没有云存储卖?有的话继续往下看。
导出 SQL 文件 – 打压缩包 – 通过内网传输到云存储上 – 开一台阿里云的按量付费实例 – 下载 SQL 压缩包 – 解压 – 通过内网导入 RDS
整个过程一小时肯定能搞定,因为云存储服务可以按流量计费,基本都不限速的。
Felldeadbird 13
Felldeadbird 13 小时 37 分钟前
内网迁移,服务器高度写 1000 万数据很快就完成了。 当然,不知道你 1000 万数据有什么内容。5G SQL 文件服务迁移大概 10 分钟完成。
bybyte 14
bybyte 10 小时 41 分钟前
物理迁移
helloworld000 15
helloworld000 10 小时 31 分钟前
直接邮寄硬盘
Junzhou 16
Junzhou 6 小时 36 分钟前 via iPhone
备份,然后 srync 或者临时带宽升级
jsrgqinbin 17
jsrgqinbin 2 小时 57 分钟前
阿里有免费的数据迁移的服务的,你找 DTS 这个产品看下
BeijingBaby 18
BeijingBaby 2 小时 50 分钟前
这么小的数据,根本不是问题啊。
qwerthhusn 19
qwerthhusn 2 小时 45 分钟前
2M 带宽,说明此站流量不大。
那为啥不把公网 IP 转成按量的,然后使用共享流量包呢?
可以用 200M 带宽,只收个流量包的费用
cxh116 20
cxh116 2 小时 29 分钟前 ❤️ 1
1. XtraBackup 备份导出.
2. 上传备份文件 OSS.
3. 在机器上面拉取 OSS 的文件(走内网,不限速的).
4. 使用 XtraBackup 恢复.
5. 查看 XtraBackup 的备份文件里的信息,设从库连到主库,等从库跟上主库.
6. 同步完成,从库转主库.
jixiangqd 21
jixiangqd 29 分钟前
@cxh116 阿里云 RDS 现在支持从 oss 导入 xtrabackup 的备份了
wuwukai007 22
wuwukai007 22 分钟前
直接把 mysql/data 压缩发过去
zhengxiaowai 23
zhengxiaowai 20 分钟前
#6 + #7 应该是*快的
导出 sql 上传到 oss,起一个机器从 oss 下载 然后导入 mysql

到底什么情况下需要使用 MySQL 事务?

众所周知,MySQL 事务具有原子性,当你需要对对张表同时进行操作的时候,为了保证要么都成功,要么都失败,必须使用事务机制。

但是仔细想想,举个例子 insert 操作,除非是 sql 语句写的有问题,正常情况下很难出错,除非是网络连接失败、数据库挂了、连接池满了等意外情况。这些都是*低概率事件。

然而如果同时操作的表不在一个库就操蛋了……所以去 tm 的事务,听天由命吧,大不了表里面多几条废数据,用什么事务!我不用了
第 1 条附言 · 21 小时 52 分钟前
纯属吐槽,我的意思是一些不太重要的业务可以不用,图个省事,特别是那种跨库的写表操作,丢了也就丢了,如果涉及订单、金额等重要业务确实使不得,分布式事务也得上
第 2 条附言 · 19 小时 59 分钟前
各位大佬说的对,然而我就是不喜欢用事务,哈哈,哪天出 bug 找我我再修复 bug,这样工作量就上来了
事务 MySQL 原子性 insert44 条回复 • 2021-09-02 16:10:04 +08:00
AngryPanda 1
AngryPanda 22 小时 41 分钟前 ❤️ 22
说的好!回去等通知。
leonme 2
leonme 22 小时 36 分钟前 via iPhone
正常情况下很难出错,这……举个例子,目前各种分布式共识算法,不就是解决非正常情况下的问题的吗? 事物本质上是简化应用层的开发工作
hqs0417 3
hqs0417 22 小时 35 分钟前
有些不一定是 SQL 语句的问题,可能是缺少必填字段,主键 /唯一键冲突。
单库上使用事务可以降低系统复杂度。

多库情况下就需要考虑*终一致了
ch2 4
ch2 22 小时 33 分钟前
我给你转 100W,转账失败了
你的钱没多,我的钱扣了
凭空消失 100W 你说事务有啥意义?
Maboroshii 5
Maboroshii 22 小时 33 分钟前
保证原子性… select update 一串操作的时候 。 当然 还要配置隔离级别这种东西。。不过我也基本没咋用过事务..
falcon05 6
falcon05 22 小时 31 分钟前 via iPhone
啊?
zhaorunze 7
zhaorunze 22 小时 28 分钟前
可以不用事务,你可以只创建一个表,其他所有场景都往这个表堆字段,行与行之间不需要共享,就不需要事务了。
yianing 8
yianing 22 小时 26 分钟前 via Android
账户的余额更改与流水创建必须在一个事务里面
Yadomin 9
Yadomin 22 小时 26 分钟前
“意外情况”,“*低概率” 就意味着不用管了?
11232as 10
11232as 22 小时 22 分钟前 ❤️ 2
事务不是个技术问题,事务是跟业务强相关得…
SlipStupig 11
SlipStupig 21 小时 26 分钟前
事务是用来保证数据库操作时的一致性和完整性啊,原子操作也是用来保证一致性啊,数据之间是有关联的一些你觉得不重要的数据可能会产生连锁反应。
比如:订单库存量,在条件竞争的情况下,可能导致库存数量为负数,在一些特定促销场景下然后导致订单爆单,这个时候公司就遭受了损失,这部分损失你愿意承担嘛?
Kilerd 12
Kilerd 21 小时 17 分钟前
您说的对!
sadfQED2 13
sadfQED2 21 小时 15 分钟前 via Android
面试的时候需要使用事物
love 14
love 21 小时 0 分钟前
too young 了
你以为就写数据库会出错?你的程序不会抛异常?抛了异常要不要回滚?就这么留着写了一半的数据集?
sy20030260 15
sy20030260 20 小时 38 分钟前
大部分垃圾代码就是「图个省事」带来的,写的人越省事,后续维护的人越蛋疼
Senorsen 16
Senorsen 20 小时 2 分钟前
1L + 10086 哈哈哈哈哈

你操作一次出现异常(比如网络错误)的概率假设是万分之一,十万次操作出现异常的概率是多少?更多次操作呢?
图省事没有事务了,除非用户量很少不到几十几百个,否则用户资源状态不一致,全乱了,导致不可用,怎么办?事后处理修数据怕是都难。
seeker 17
seeker 19 小时 29 分钟前
处理钱的时候。如果是个博客啥的,没了就没了把。
billlee 18
billlee 19 小时 21 分钟前 ❤️ 1
开事务还提升性能啊,innodb 不开事务那其实就是每条语句 auto-commit, 每行写入语句都要刷盘
zhangxiaodao 19
zhangxiaodao 18 小时 14 分钟前
大多数时候,事务是和锁一起使用用来控制并发的。非并发情况,用或不用,都是业务对编码的容忍度要求。

但是,小同志,你这个『大不了多几条废数据』的思想不能有啊,写代码还是要严谨,坏习惯不能养。
shiji 20
shiji 18 小时 0 分钟前
哈哈,这就好比研究导弹干什么,搞一架客机+几组劳动人民从飞机往下一筐一筐扔手榴弹不就完了

不过一个科技公司一旦高层技术人员都是这个思想,并对新来的 /严谨的人嗤之以鼻的话,基本离完蛋不差几年了。
EscYezi 21
EscYezi 15 小时 42 分钟前 via iPhone
“丢了就丢了”……希望出生产事故的时候楼主还能这么想
yeqizhang 22
yeqizhang 15 小时 17 分钟前 via Android
标题就起的很唬人,正文又描述的其它
dayeye2006199 23
dayeye2006199 15 小时 6 分钟前
我要是公司领导,我只想把 LZ 拖出去打屁屁
felixcode 24
felixcode 14 小时 28 分钟前
所以其它的可靠性设计在你这样的程序面前全都是个摆设,因为这样的程序在哪都是水桶的*短板。
yogogo 25
yogogo 9 小时 40 分钟前
多表操作的时候
paranoiddemon 26
paranoiddemon 9 小时 21 分钟前 via Android
加事务代码量很大?
murmur 27
murmur 8 小时 41 分钟前
这就是互联网思维,亲爱的用户我是你 X 爱用用不用拉倒,数据丢了就陪你点代金券就当无事发生
msaionyc 28
msaionyc 8 小时 4 分钟前
希望以后不会遇到你这种同事
tabris17 29
tabris17 7 小时 51 分钟前 via iPhone ❤️ 3
再过几年,你回过头来看当年发的这个帖子,你内心会有多尴尬呀

当然,那时候你可能也已经转行了
pkoukk 30
pkoukk 7 小时 48 分钟前
啧啧啧,我上大学的时候都问不出这种问题来。
cbasil 31
cbasil 7 小时 35 分钟前
例如商城里面优惠券使用,如果优惠券已经抵扣了,但是下单是因为用户账户问题下单失败,不用事务怎么处理优惠券还原的问题
sujin190 32
sujin190 6 小时 51 分钟前
恰恰多个操作不在同一个库才更需要事务,哥们,你搞反了
banmuyutian 33
banmuyutian 6 小时 41 分钟前
逆天
realpg 34
realpg 6 小时 14 分钟前 ❤️ 1
楼主,你要是入职哪个第三方支付一定告诉我啊,我多注册接
heyjei 35
heyjei 5 小时 52 分钟前 via Android
你们其实没看到楼主的问题在哪。

楼主的问题是一个 insert 语句还要用 begin transaction, commit 包起来,觉得很麻烦。楼主不知道的是单独的 sql 语句,数据库执行的时候是默认开始并在语句结束后自动提交事务的。
heyjei 36
heyjei 5 小时 44 分钟前 via Android
而我们所说的事务,一般都是指有很多个 sql 语句一起执行的时候,需要用事务包起来,要么全部执行,要么全部不执行。

在这里触发事务回滚的不一定是 SQL 写错了,或者磁盘故障,或者网络故障,更多的时候,我们触发回滚都业务上的逻辑,比如转账的时候,先 sql 减去了一个人的钱,然后通过另外一个 sql 语句发现对方账号锁了,转不进钱,于是这里只需要回滚事务就可以了,不需要重新执行 sql 一步步的恢复现场。

这只是一个简单的例子,数据库的事务远远不止这些。
heyjei 37
heyjei 5 小时 42 分钟前 via Android
善用事务,可以*大的简化和优化你的业务逻辑代码
kenvix 38
kenvix 5 小时 38 分钟前
先不说别的,姑且问一句写过存储过程吗
darkengine 39
darkengine 4 小时 40 分钟前
是否需要提桶跑路 = 调用次数 * 故障发生概率 * 故障后果

由此可知,不能因为“故障发生概率低”就不管
Felldeadbird 40
Felldeadbird 3 小时 37 分钟前
insert 语句也会出错啊。假定你某个 SQL 不稳定,导致一直 sleep 。这时候你 insert 就 wait 状态。你没事务的话,等 wait 结束后,他插入了数据。
tairan2006 41
tairan2006 3 小时 4 分钟前
、楼主脑子里没有并发的概念么
sakasaka 42
sakasaka 3 小时 3 分钟前
防止安全事故还有就是简化代码逻辑
zxcslove 43
zxcslove 3 小时 1 分钟前
就发泄情绪呗,谁还没个情绪了,哈哈哈
chendy 44
chendy 1 小时 15 分钟前
看了下楼主的历史发帖,细思*恐

MYSQL创建数据库,切换数据库,创建表,给表添加属性

先创建一个数据库

create database demo1;

使用数据库

use demo1;

在数据库中创建一个表

create table user2(

添加表的每一列的 属性

id int primary key auto_increment,

username varchar(20) unique,

password varchar(20) not null,

age int,

birthday date

);

需要一台服务器, 跑 gitlab、ci、mysql 之类的服务用于测试。现阶段是租用物理机好还是云服务器好呢?

如题。

第 1 条附言 · 36 天前
谢谢各位的建议。现在主要考虑的点是,如果用云主机的话会不会不方便公司内部程序的测试,如果是物理机的话宽带、服务器安全又是一个问题。比较纠结。
机好 MySQL gitlab 服务器11 条回复 • 2021-06-04 16:45:53 +08:00
cccp2020 1
cccp2020 36 天前
果断阿里云啊,*近很便宜,物理机还得考虑人力成本了: http://aakw.net/24mfx
beautwill 2
beautwill 36 天前
建议还是阿里或者腾讯云吧,v2er 专供折上折 v: beautwill
jingslunt 3
jingslunt 36 天前
win10 开个 10g 的虚拟机测试不香吗?没有外网需求 躺着多好,省得楼上收割。
CEBBCAT 4
CEBBCAT 36 天前
没用过物理机,但我觉得选云服务器应该差不了。物理机是不是还要操心系统安装之类的?云服务器从运维角度来讲应该会省心一些。

PS,一楼的链接是 AFF 链接: https://www.aliyun.com/activity/618/2021?userCode=0amqgcs9 去掉尾巴后是: https://www.aliyun.com/activity/618/2021

PSS 个人不推荐阿里云,可以看看腾讯云
zhengfan2016 5
zhengfan2016 36 天前
建议自己组一台 nas,弄个 10 代 i5 es 500 块,配个 matx 主板 500 块,2k 内搞定,美滋滋。有钱也可以买 29999 的 64 核县城撕裂者组 itx nas
chniccs 6
chniccs 36 天前
云吧,新用户一年的费用可能比你物理机的电费都便宜
limuyan44 7
limuyan44 36 天前
你这要求一年也就 99 块,费那些事干啥。
misaka19000 8
misaka19000 36 天前
@zhengfan2016 #5 能给个更详细一些的配置列表吗?谢谢♪(・ω・)ノ
q428202849 9
q428202849 36 天前
看你运算大不大
云和物理机我们都有可以找我
zhengfan2016 10
zhengfan2016 35 天前 ❤️ 1
@misaka19000 https://zhongce.sina.com.cn/article/view/79566/

11
Cbdy 35 天前 via Android
为什么不买个二手破电脑干这事儿

MySQL 避坑指南之隐式数据类型转换

今天我们来聊聊 MySQL 中存在的隐式数据类型转换以及可能带来的问题。

当两个不同类型的数据进行运算时,为了使得它们能够兼容,MySQL 可能会执行隐式的数据类型转换。例如,MySQL 在需要时会自动将字符串转换为数字,反之亦然。

  1. mysql> SELECT 1+‘1’;
  2. -> 2
  3. mysql> SELECT CONCAT(2,‘ test’);
  4.         -> ‘2 test’

我们也可使用 CAST() 函数将数字显式转换为字符串。CONCAT() 函数中的隐式类型转换是因为它只能接收字符串类型的参数。

  1. mysql> SELECT 38.8, CAST(38.8 AS CHAR);
  2. -> 38.8, ‘38.8’
  3. mysql> SELECT 38.8, CONCAT(38.8);
  4.         -> 38.8‘38.8’

以下是比较运算中的类型转换规则:

如果任意一个参数为 NULL,比较的结果为 NULL,<=> 相等比较运算符除外。NULL <=> NULL 的运算结果为 true,不需要进行类型转换。

如果两个参数都是字符串,执行字符串比较。

如果两个参数都是整数,执行整数比较。

如果不是和数字进行比较,十六进制数值将被看作二进制字符串。

如果一个参数是 TIMESTAMP 或者 DATETIME 字段,另一个参数是常量,该常量将会在比较之前转换为时间戳类型。这一规则是为了更好地支持 ODBC 规范。IN() 运算符中的参数不会执行这一转换。为了保险起见,记得在执行比较运算时使用完整的日期时间、日期或者时间字符串。例如,在使用 BTWEEN 运算符判断日期或者时间数据时,利用 CAST() 函数将数据的类型显示转换成相应的类型。

返回单行结果的子查询不会被当作常量。例如,当一个返回整数的子查询和 DATETIME 数据进行比较时,DATETIME 将会被转换为整数类型,而不会将子查询的结果转换为时间类型。如果想要执行日期时间比较,可以使用 CAST() 函数显式将子查询的结果转换为 DATETIME 类型。

如果一个参数为精确数字类型(decimal),比较的方法取决于另一个参数的类型。如果另一个参数是精确数字或者整数类型,使用精确数字比较;如果另一个参数是浮点数类型,使用浮点数比较。

其他情况下,使用浮点数比较。例如,字符串和精确数字的比较使用浮点数比较方法。

关于时间类型之间的转换规则,可以参考官方文档。

以下示例演示了将字符串转换为数字的比较操作:

  1. mysql> SELECT 1 > ‘6x’;
  2. -> 0
  3. mysql> SELECT 7 > ‘6x’;
  4. -> 1
  5. mysql> SELECT 0 > ‘x6’;
  6. -> 0
  7. mysql> SELECT 0 = ‘x6’;
  8.         -> 1

如果将字符串类型的字段和数字进行比较,MySQL 无法使用该字段上的索引快速查找数据。例如,str_col 是一个索引字段,该索引无法用于以下语句:

SELECT * FROM tbl_name WHERE str_col=1;

问题的原因在于很多不同的字符串都可以转换为数字 1,例如’1’、’ 1’ 或者 ‘1a’。

浮点数和 INTEGER 类型的超大数值之间的比较是近似比较,因为整数在比较之前需要转换为双精度浮点数,双精度浮点数无法精确地表示所有的 64 位整数。例如,整数 253 + 1 无法使用浮点数进行表示,只能近似为 253 或者 253 + 2。

举例来说,以下只有*个比较运算中的两个值相等,但是两个比较运算都返回了 true(1):

  1. mysql> SELECT ‘9223372036854775807’ = 9223372036854775807;
  2. -> 1
  3. mysql> SELECT ‘9223372036854775807’ = 9223372036854775806;
  4.         -> 1

字符串转换为浮点数与整数转换为浮点数的方式可能不同。整数可能使用 CPU 转换为浮点数,而字符串可能使用浮点数乘法进行逐位转换。另外,转换结果可能受到各种因素的影响,例如计算机的架构、编译器版本或者优化级别等。避免这种问题的方法之一就是使用 CAST() 函数,这样数据就不会被隐式转换为浮点数。

  1. mysql> SELECT CAST(‘9223372036854775807’ AS UNSIGNED) = 9223372036854775806;
  2.         -> 0

关于浮点数比较的更多信息,可以参考官方文档。

MySQL 服务器提供了一个转换库 dtoa,可以支持字符串或者 DECIMAL 数据和近似数字(FLOAT/DOUBLE)之间的基本转换功能:

跨平台的一致性转换结果,例如,可以消除 Unix 和 Windows 之间的差异。

可以精确表示之前无法提供足够精度的数据,例如接近 IEEE 限制的数据。

以尽可能高的精度将数字转换成字符串格式。dtoa 的精度总是等于或者高于标准 C 代码库函数。

数字或者时间类型到字符串的隐式转换结果的字符集和排序规则取决于 character_set_connection 和 collation_connection 系统变量。(这些变量通常使用 SET NAMES 进行设置。关于连接的字符集的信息,可以参考官方文档。)

这意味着这种转换的结果是一个非二进制的字符串(CHAR、VARCHAR 或者 LONGTEXT),除非连接字符集被设置为 binary。此时,转换结果是一个二进制字符串(BINARY、VARBINARY 或者 LONGBLOB)。

对于整数类型的表达式,前文所述的表达式求值和表达式赋值有所不同。例如以下语句:

CREATE TABLE t SELECT integer_expr;

这种情况下,表 t 的字段类型取决于整数表达式的长度,可能是 INT 或者 BIGINT。如果表达式的*大长度超过了 INT,使用 BIGINT 类型。这就意味着我们可以通过一个足够长的表达式创建 BIGINT 类型的字段:

  1. CREATE TABLE t SELECT 000000000000000000000 AS col;
  2. DESC t;
  3. Field|Type |Null|Key|Default|Extra|
  4. —–+——+—-+—+——-+—–+
  5. col  |bigint|NO  |   |0      |     |

JSON 数据的比较分为两种情况。*层次的比较基于被比较数据的 JSON 类型,如果两个类型不同,比较的结果取决于具有更高优先级的类型;如果两个数据的 JSON 类型相同,使用具体的类型规则进行第二层次的比较。对于 JSON 和非 JSON 数据的比较,先将非 JSON 数据转换为 JSON 类型,然后进行比较。详细信息可以参考官方文档。

MySQL 十大常用字符串函数

 

%title插图%num

数据库函数是一种具有某种功能的模块,可以接收零个或多个输入值,并且返回一个输出值。MySQL 为我们提供了许多用于处理和分析数据的系统函数,本文给大家介绍 10 个常用的字符串函数,以及相关的其他函数。

%title插图%num

CONCAT()

CONCAT(str1,str2,…))函数用于返回多个字符串连接之后的字符串,例如:

  1. SELECT CONCAT(‘MySQL’, ‘字符串’, ‘函数’) AS str;
  2. str |
  3. ————–+
  4. MySQL字符串函数|

如果该函数中的任何参数为 NULL,返回结果为 NULL。例如:

  1. SELECT CONCAT(‘MySQL’, NULL, ‘函数’) AS str;
  2. str|
  3. —+
  4.    |

对于字符串常量,我们也可直接将它们连写在一起。例如:

  1. SELECT ‘MySQL’ ‘字符串’ ‘函数’ AS str;
  2. str |
  3. ————–+
  4. MySQL字符串函数|

以上方式只能用于连接字符串常量,不能用于连接字段的值。

????如果启用了 SQL 模式 PIPES_AS_CONCAT,MySQL 逻辑或运算符(||)也可以用于连接字符串,类似于 Oracle 和 PostgreSQL。

除了 CONCAT(str1,str2,…)) 函数之外,CONCAT_WS(separator,str1,str2,…))函数表示使用指定的分隔符 separator 连接多个字符串,分隔符为 NULL 则返回 NULL。例如:

  1. SELECT CONCAT_WS(‘-‘, ‘MySQL’, NULL, ‘字符串’) AS str1,
  2. CONCAT_WS(NULL, ‘MySQL’, ‘字符串’) AS str2;
  3. str1 |str2|
  4. ———–+—-+
  5. MySQL-字符串|    |

%title插图%num

LOWER()

LOWER(str)和LCASE(str)函数用于将字符串转换为小写形式,例如:

  1. SELECT LOWER(‘MySQL字符串函数’) AS str1, LCASE(‘MySQL字符串函数’) AS str2;
  2. str1 |str2 |
  3. ————–+————–+
  4. mysql字符串函数|mysql字符串函数|

MySQL 大小写转换函数不支持二进制字符串(BINARY、VARBINARY、BLOB)),可以将其转换为非二进制的字符串之后再进程处理。例如:

  1. SELECT LOWER(BINARY ‘MySQL字符串函数’) AS str1,
  2. LOWER(CONVERT(BINARY ‘MySQL字符串函数’ USING utf8mb4)) AS str2;
  3. str1 |str2 |
  4. ——————-+————–+
  5. MySQL孠符串堽栰|mysql字符串函数|

%title插图%num

UPPER()

UPPER(str)和UCASE(str)函数用于将字符串转换为大写形式,例如:

  1. SELECT UPPER(‘MySQL字符串函数’) AS str1, UCASE(‘MySQL字符串函数’) AS str2;
  2. str1 |str2 |
  3. ————–+————–+
  4. MYSQL字符串函数|MYSQL字符串函数|

%title插图%num

LENGTH()

LENGTH(str)和OCTET_LENGTH(str)函数用于返回字符串的字节长度,例如:

  1. SELECT LENGTH(‘MySQL字符串函数’) AS len1, OCTET_LENGTH(‘MySQL字符串函数’) AS len2;
  2. len1|len2|
  3. —-+—-+
  4.   20|  20|

在 utf8mb4 编码中,一个汉字字符占用 3 个字节。

另外,CHAR_LENGTH(str)和CHARACTER_LENGTH(str)函数用于返回字符串的字符长度,也就是字符个数。例如:

  1. SELECT CHAR_LENGTH(‘MySQL字符串函数’) AS len1, CHARACTER_LENGTH(‘MySQL字符串函数’) AS len2;
  2. len1|len2|
  3. —-+—-+
  4.   10|  10|

BIT_LENGTH(str)函数用于返回字符串的比特长度(比特数量),例如:

  1. SELECT BIT_LENGTH(‘MySQL字符串函数’) AS len;
  2. len|
  3. —+
  4. 160|

一个字节包含 8 个比特。

%title插图%num

SUBSTRING()

SUBSTRING(str,pos)、SUBSTRING(str FROM pos)、SUBSTRING(str,pos,len)以及SUBSTRING(str FROM pos FOR len)函数都可以用于返回从指定位置 pos 开始的子串,len 表示返回子串的长度;pos 为 0 表示返回空字符串。例如:

  1. SELECT SUBSTRING(‘MySQL字符串函数’, 6) AS str1,
  2. SUBSTRING(‘MySQL字符串函数’ FROM 6) AS str2,
  3. SUBSTRING(‘MySQL字符串函数’, 6, 3) AS str3,
  4. SUBSTRING(‘MySQL字符串函数’ FROM 6 FOR 3) AS str4,
  5. SUBSTRING(‘MySQL字符串函数’, 0) AS str5;
  6. str1 | str2 |str3 |str4 |str5|
  7. ———+———+——-+——+—-+
  8. 字符串函数|字符串函数|字符串 |字符串 |    |

位置参数 pos 可以为负数,此时返回的子串从字符串右侧第 pos 个字符开始。例如:

  1. SELECT SUBSTRING(‘MySQL字符串函数’, -2) AS str1,
  2. SUBSTRING(‘MySQL字符串函数’, -5, 3) AS str2;
  3. str1 |str2 |
  4. ——+——+
  5. 函数  |字符串 |

另外,SUBSTR()和MID()函数都是 SUBSTRING() 函数的同义词,也支持以上 4 种形式。

LEFT(str,len)函数返回字符串 str 左侧的 len 个字符,RIGHT(str,len)函数返回字符串 str 右侧的 len 个字符。例如:

  1. SELECT LEFT(‘MySQL字符串函数’,5) AS str1,
  2. RIGHT(‘MySQL字符串函数’,5) AS str2;
  3. str1 |str2 |
  4. —–+———+
  5. MySQL|字符串函数|

SUBSTRING_INDEX(str,delim,count)函数返回第 count 个分隔符 delim 之前的子串。如果 count 为正数,从左侧开始计数并返回左侧的所有字符;如果 count 为负数,从右侧开始计数并返回右侧的所有字符。例如:

  1. SELECT SUBSTRING_INDEX(‘张三;李四;王五’, ‘;’, 2) AS str1,
  2. SUBSTRING_INDEX(‘张三;李四;王五’, ‘;’, -2) AS str2;
  3. str1 |str2 |
  4. ——–+——–+
  5. 张三;李四|李四;王五|

%title插图%num

TRIM()

TRIM([remstr FROM] str)函数用于返回删除字符串 str 两侧所有 remstr 字符串之后的子串,remstr 默认为空格。例如:

  1. SELECT TRIM(‘ MySQL字符串函数 ‘) AS str1,
  2. TRIM(‘-‘ FROM ‘–MySQL字符串函数–‘) AS str2;
  3. str1 |str2 |
  4. ————–+————–+
  5. MySQL字符串函数|MySQL字符串函数|

TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str)函数用于返回删除字符串 str 两侧/左侧/右侧所有 remstr 字符串之后的子串,默认删除两侧字符串(BOTH),remstr 默认为空格。例如:

  1. SELECT TRIM(LEADING ‘ ‘ FROM ‘ MySQL字符串函数 ‘) AS str1,
  2. TRIM(TRAILING ‘-‘ FROM ‘–MySQL字符串函数–‘) AS str2;
  3. str1 |str2 |
  4. —————-+—————-+
  5. MySQL字符串函数  |–MySQL字符串函数|

%title插图%num

LPAD()/RPAD()

LPAD(str,len,padstr)函数表示字符串 str 的左侧使用 padstr 进行填充,直到长度为 len;RPAD(str,len,padstr)函数表示在字符串 str 的右侧使用 padstr 进行填充,直到长度为 len。例如:

  1. SELECT LPAD(123, 6, ‘0’) AS str1, LPAD(123, 2, ‘0’) AS str2,
  2. RPAD(123, 6, ‘0’) AS str1, RPAD(123, 2, ‘0’) AS str1;
  3. str1 |str2|str1 |str1|
  4. ——+—-+——+—-+
  5. 000123|12  |123000|12  |

当字符串 str 的长度大于 len 时,相当于从右侧截断字符串。

另外,REPEAT(str,count)函数用于将字符串 str 复制 count 次并返回结果。例如:

  1. SELECT REPEAT(‘????’, 5) AS str;
  2. str |
  3. ———-+
  4. ????????????????????|

%title插图%num

INSTR()

INSTR(str,substr)函数用于返回子串 substr 在字符串 str 中*次出现的索引位置,没有找到子串时返回 0。例如:

  1. select INSTR(‘MySQL字符串函数’, ‘字符串’) AS index1,
  2. INSTR(‘MySQL字符串函数’, ‘日期’) AS index2,
  3. INSTR(‘MySQL字符串函数’, ) AS index3,
  4. INSTR(‘MySQL字符串函数’, null) AS index4;
  5. index1|index2|index3|index4|
  6. ——+——+——+——+
  7.      6|     0|     1|      |

另外,LOCATE(substr,str)函数也可以用于返回子串 substr 在字符串 str 中*次出现的索引位置,和 INSTR(str,substr) 函数唯一的不同就是参数的顺序相反。

LOCATE(substr,str,pos)函数返回子串 substr 在字符串 str 中从位置 pos 开始*次出现的索引位置,例如:

  1. SELECT LOCATE(‘S’,‘MySQL Server’, 5) AS ind;
  2. ind|
  3. —+
  4.   7|

FIELD(str,str1,str2,str3,…) 函数返回字符串 str 在后续字符串列表中出现的位置,没有找到时返回 0。例如:

  1. SELECT FIELD(‘李四’, ‘张三’, ‘李四’, ‘王五’) AS ind;
  2. ind|
  3. —+
  4.   2|

FIND_IN_SET(str,strlist) 函数返回字符串 str 在列表字符串 strlist 中出现的位置,strlist 由 N 个子串使用逗号分隔组成。例如:

  1. SELECT FIND_IN_SET(‘李四’, ‘张三,李四,王五’) AS ind;
  2. ind|
  3. —+
  4.   2|

%title插图%num

REPLACE()

REPLACE(str,from_str,to_str)函数用于将字符串 str 中所有的 from_str 替换为 to_str,返回替换后的字符串。例如:

  1. SELECT REPLACE(‘MySQL字符串函数’, ‘字符串’, ‘日期’) AS str1,
  2. REPLACE(‘MySQL字符串函数’, ‘字符串’, ) AS str2;
  3. str1 |str2 |
  4. ————+———+
  5. MySQL日期函数|MySQL函数|

另外,INSERT(str,pos,len,newstr)函数用于在字符串 str 的指定位置 pos 之后插入子串 newstr,替换随后的 len 个字符。例如:

  1. SELECT INSERT(‘MySQL字符串函数’, 6, 3, ‘日期’) AS str;
  2. str |
  3. ————+
  4. MySQL日期函数|

%title插图%num

REVERSE()

REVERSE(str)函数用于将字符串 str 中的字符顺序进行反转。例如:

  1. SELECT REVERSE(‘上海自来水来自海上’)=‘上海自来水来自海上’ AS “回文”;
  2. 回文|
  3. —-+
  4.    1|

 

mysql主从数据库同步和字符集问题

1.mysql主从数据库同步问题

在使用mysql 5.0 主从数据库同步时遇到问题一些问题:
在主从数据库同步时,我们可能会选择哪些数据库要求同步,而那些数据库忽视,这两个功能是靠/etc/my.cnf文件中的两个键名 binlog_do_db 和 binlog_ignore_db 来实现的
binlog_do_db = 填写需要同步的数据库,多个数据库则用‘,’隔开
binlog_ignore_db = 填写不需同步的数据库,多个数据库用 ‘,’隔开
主数据库读取键值,可选择生成数据库日志文件。从服务器根据主服务器日志文件来更新自己的数据库
理论上这些都是可行的,然而实际实现中会遇到一些问题,问题如下:
从终端用 mysql -u -p 连接mysql数据库,主服务器执行数据库操作,在binlog_do_db范围内的数据库都会做日志记录,使用mysql提供的api函数用程序连接数据库执行sql语句缺不写入日志
几经周转测试,终于发现将binlog_ignore_db去掉,而且是连键名一起注释掉,这时候主从数据库同步方可成功,API函数进行的数据库操作可以写入日志了
这不知是官方bug,还是自己哪方面配置数据库错误。解决方案目前为止只限于此。
 

2.mysql 字符集设置

2.1终端访问:

通常终端访问只需在/etc/my.cnf中将default-charcter-set=utf8就不会出现乱码

2.2程序连接:

先看mysql字符集问题

数据库链接命令行中输入
show variables like ‘char%’;
得到以下结果
+————————–+—————————-+
| 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.28 sec)

这个就是字符集表了

问题1:向默认字符集为utf8的数据表插入utf8数据前没有设置连接字符集,查询时设置字符集为utf8,导致的查询乱码。

1. 在插入的时候根据mysql服务的默认设置,character_set_client、character_set_connection和character_set_results均为latin1;所以在插入的时候,程序会把utf8字符集当成latin1(这一步不会转换,只是取数据),那么存储过程中数据会经过以下变换 latin1->latin1=>utf8的字符集转换过程,这一过程每个插入的汉字会经历程序到动态库;所以字符都会从原来的3个字节(程序utf8)在*后一步(latin1=>utf8)变成6个字节保存。

2. 查询时的结果将经过utf8=>utf8的字符集转换过程,将保存的6个字节原封不动返回,产生乱码。

图片2

图1

问题2: 向默认字符集为latin1的数据表插入utf8编码的数据前设置了连接字符集为utf8,取出数据出错

插入时根据连接字符集设置,character_set_client、character_set_connection和character_set_results均为utf8;

插入数据将经过utf8=>utf8=>latin1的字符集转换,若原始数据中含有/u0000~/u00ff范围以外的Unicode字符,会因为无法在latin1字符集中表示而被转换为“?”(0x3F)符号,以后查询时不管连接字符集设置如何都无法恢复其内容了。

图片3

图2

 

 

3. mysql API PHP C

一般页面的PHP程序运行时间较短,在连接到数据库后用set names语句设置一次连接字符即可。但当使用长连接时,请注意保持通畅并在端来连接后再次用set names设置连接字符集。

 

   问题1:
为什么有时候我们用终端登录的时候就不是乱码,但是用程序进行sql操作的时候就出现乱码了呢。
answer:因为程序链接的时候用的是动态链接库连接数据库的,而终端用的mysql_client自己安装的程序,这两个字符集可能会不相同。
问题2:
为什么程序运行有一段时间后就开始出现乱码了,插入与取出数据都是乱码了。
answer:connection有一个时间,超时就会重新连接 ,有两种设置方法
3.1 执行sql语句 set names ‘utf8’ 2
3.2 mysql_options(ledMysql, MYSQL_SET_CHARSET_NAME, “utf8”);
*种方法只是暂时有效,第二种方法再每次重连的时候都会设置字符集为utf8
   使用mysql api时初始化数据库句柄后马上用 mysql_option设定MYSQL_SET_CHARASET_NAME属性为utf8,这样就不需要使用set names语句指定连接字符集。mysql_ping重新断开连接时也会吧连接字符重置为utf8,不需每次重连都set names
mysql带来的问题主要是字符集的问题。其实有一种更*的方法就是在安装数据库的时候只保留utf8字符集那不管怎么连接都不会出现乱码了。

ATTENTION:

    用程序连接数据库的时候调用的是动态链接库libmysqlclient.so or libmysqlclient.a

my.cnf 中的default_character_set 设置只影响在终端这种用mysql命令连接服务器时连接字符集,不会对使用libmysqlclient库连接mysql的应用程序产生任何作用。

 

4. 编译问题

./configure –prefix=/usr/local/mysql –sysconfdir=/etc –localstatedir=/var/lib/mysql –enable-local-infile –enable-assembler –with-charset=utf8  –with-big-tables  –with-plugin-partition –with-plugin-federated

 

如果是非编译版本,安装的时候请注意使用,否则可能会安装到错误的位置

/usr/local/mysql/bin/mysqld_install –basedir=/usr/local/mysql –ldata=/var/lib/mysql

 

一般情况下都是不能正常链接数据库,错误提示一般为:

ERROR 2002: Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)

其实网上大家问的*多的都是整个问题,说什么链接不到mysqld.sock,其实大家不妨看看mysql的错误日志就明白怎么回事,我这里的错误日志是在

/var/lib/mysql/*.err 你会发现mysql只所以不能启动,是因为/var/lib/mysql的权限不允许mysql服务访问,英文mysql默认是调用mysql用户来启动服务的,好了,既然知道是什么原因找到不能启动,那就简单了。我们只要

chown -R mysql:mysql /var/lib/mysql 就行,如果还是启动不了,再慢慢调试权限,反正一般启动不了都是权限的问题。

MySQL 不允许从远程访问的解决方法

解决方法:
1。 改表法。
可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从”localhost”改称”%”

复制代码代码如下:
mysql -u root -pvmwaremysql>use mysql;
mysql>update user set host = ‘%’ where user = ‘root’;
mysql>select host, user from user;

2. 授权法。
例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。
GRANT ALL PRIVILEGES ON *.* TO ‘myuser’@’%’ IDENTIFIED BY ‘mypassword’ WITH GRANT OPTION;
FLUSH PRIVILEGES;
如果你想允许用户myuser从ip为192.168.1.6的主机连接到mysql服务器,并使用mypassword作为密码
GRANT ALL PRIVILEGES ON *.* TO ‘myuser’@’192.168.1.3’ IDENTIFIED BY ‘mypassword’ WITH GRANT OPTION;
FLUSH PRIVILEGES;
如果你想允许用户myuser从ip为192.168.1.6的主机连接到mysql服务器的dk数据库,并使用mypassword作为密码
GRANT ALL PRIVILEGES ON dk.* TO ‘myuser’@’192.168.1.3’ IDENTIFIED BY ‘mypassword’ WITH GRANT OPTION;
FLUSH PRIVILEGES;
我用的*个方法,刚开始发现不行,在网上查了一下,少执行一个语句 mysql>FLUSH RIVILEGES 使修改生效.就可以了
另外一种方法,不过我没有亲自试过的,在csdn.net上找的,可以看一下.
在安装mysql的机器上运行:
1、d:\mysql\bin\>mysql -h localhost -u root //这样应该可以进入MySQL服务器
2、mysql>GRANT ALL PRIVILEGES ON *.* TO ‘root’@’%’ WITH GRANT OPTION //赋予任何主机访问数据的权限
3、mysql>FLUSH PRIVILEGES //修改生效
4、mysql>EXIT //退出MySQL服务器
这样就可以在其它任何的主机上以root身份登录啦!

MySQL中的alter table命令的基本使用方法及提速优化

首先,分析以下alter一个超大表低效率的原因:
1. mysql中alter表的机制是:创建一个符合alter目标的表,然后把数据全部插入到新表中,然后删除老表。
2. 在数据迁移时,每插入一行,需要对索引进行一次更新。效率低下且会产生索引碎片
3. 当没有足够的内存,或者表上的索引非常多时,效率十分的低下。

避免方式:

1. 使用正确的alter语句
如露alter的目标是更改某列的default值。mysql有特定的语句只对frm文件进行操作,而不更新index和data。
错误的方式:alter table tbl_name modify column col1 int not null default 5;
正确的方式:alter table tbl_name alter column col1 set default 5;

2. 手动的执行alter的机制
首先,create tbl_new like tbl_old;
然后,alter table modify column …
然后,alter tbl_new disable keys;
—load data—
然后,alter tbl_new enable keys;
*后,rename table tbl_old to tbl_new,tbl_new to tbl_old;

3. 人工修改frm表(危险!!!)
在5.1.36的myisam下,对这种方法进行了测试,并没有成功,会报index corrupted的错误。

首先,create tbl_new like tbl_old;
然后,alter table modify column …
然后,flush tables with read lock;
接着在shell中将两个表的frm文件互换。

*后,unlock tables;

PowerDesigner逆向工程导入MYSQL数据库总结

转载自:https://www.cnblogs.com/mophy/p/5930000.html

PowerDesigner逆向工程导入MYSQL数据库总结

由于日常数据建模经常使用PowerDesigner,使用逆向工程能更加快速的生成模型提高效率,所以总结使用如下:

首先现在PowerDesigner,这里提供PD16.5版本链接: http://pan.baidu.com/s/1i4SyIRN 密码: fb2m

1.      安装MYSQL的ODBC驱动

Connector/ODBC 5.1.13 下载地址:

http://dev.mysql.com/downloads/connector/odbc/5.1.html

%title插图%num

选择win-64 MIS安装包,进行直接安装就可以了。

2.      配置OBDC驱动连接

选择控制面板->系统和安全->管理工具–>ODBC 数据源

%title插图%num

%title插图%num

 

%title插图%num

%title插图%num

%title插图%num

 

3.      打开PowerDesigner :

1)文件->新建新物理模型

%title插图%num

%title插图%num

2)数据库->connect to a Data Source

%title插图%num

 

填入基本信息

%title插图%num

4)开始逆向生成

%title插图%num

%title插图%num

%title插图%num

%title插图%num

确定后等待生成就好了。

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速