使用mysqldump 对一个数据库进行备份,然后恢复到另一个数据库中,遇到如下报错
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Y','Y','root');
显然是语句的语法问题,查看文件对应位置的内容,是红色部分导致报错。
LOCK TABLES `USER` WRITE;
/*!40000 ALTER TABLE `USER` DISABLE KEYS */;
INSERT INTO `USER` VALUES (1,'Y','Y','Y','Y','Y','Y','XXX酆9聜锟 Y','Y','yangql');
PASSWORD 字段为 mediumblob 字段导致“’”分隔符被吞噬,由于保存密码字段的二进制编码的问题,引号分隔符被当作了数据的一部分,从而使得数据导入异常。
CREATE TABLE `USER` (
`USER_ID` bigint(20) NOT NULL,
`ALTER_PRIV` char(1) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '0',
.....
`PASSWORD` mediumblob NOT NULL,
`SELECT_PRIV` char(1) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '0',
.....
UNIQUE KEY `UNIQUEUSER` (`USERNAME`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
尝试手工对导出的文本文件进行修改,总是将密码修改为其他字段一直不成功
又由于此表被其他表作为外键父表引用,不能直接对插入的数据进行delete操作,选择手工将密码字段update。如果将一个字段更新为二进制模式呢?
这里使用把16进制的字符串转为二进制的数据导入库中,
update user set PASSWORD=UNHEX('79616E67716C20697320E58C97E59CA8E58D97E696B9') where USERNAME='yangql';
介绍一下 HEX,UNHEX的使用方法。
root@rac1 : (none) 22:05:17> select hex('yangql is 北在南方');
+----------------------------------------------+
| hex('yangql is 北在南方') |
+----------------------------------------------+
| 79616E67716C20697320E58C97E59CA8E58D97E696B9 |
+----------------------------------------------+
1 row in set (0.00 sec)
root@rac1 : (none) 22:05:23> select
unhex('79616E67716C20697320E58C97E59CA8E58D97E696B9');
+-------------------------------------------------------+
| unhex('79616E67716C20697320E58C97E59CA8E58D97E696B9') |
+-------------------------------------------------------+
| yangql is 北在南方 |
+-------------------------------------------------------+
1 row in set (0.00 sec)