我在尝试加载mysqldump文件时收到语法错误。加载mysqldump文件时出现sql语法错误
我的问题有几个部分组成:
(1)为什么是MySQL的无法正确读取mysqldump的输出的文件? (2)如何让mysql读取文件中的相关数据?
继承人的一些细节:
mysqldump -u username -p dbname > mydumpfile.sql
变细(显然)
mysql -u testuser -p testdbname < mydumpfile.sql
获得通过只有部分(约1/3)的文件,然后给出一个语法错误:
ERROR 1064 (42000) at line 249: 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 'randomimproperlydisplayingjapanesetext',''),(508715,134707' at line 1
显示为语法错误的文本在新插入语句开始后不久。
上一行中的(大)插入语句语句未输入到数据库中。
数据来自日文文本数据库,并且该列具有utf8_general_ci归类。
MySQL版本5.6.23在Windows XP上。
以下是其他相关变量(我认为):
mysql> show variables like '%char%';
+--------------------------+------------------------------+
| Variable_name | Value |
+--------------------------+------------------------------+
| character_set_client | sjis |
| character_set_connection | sjis |
| character_set_database | sjis |
| character_set_filesystem | binary |
| character_set_results | sjis |
| character_set_server | sjis |
| character_set_system | utf8 |
| character_sets_dir | C:\mysql\share\charsets\ |
+--------------------------+------------------------------+
编辑基于下面的答案,我确定有是一个SET NAMES
线中的mysqldump来设置它为UTF8。
这里是SHOW CREATE TABLE trouble_table
结果:
CREATE TABLE `trouble_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`version_id` int(11) DEFAULT NULL,
`myutf8column` varchar(100) CHARACTER SET utf8 DEFAULT NULL,
`mysjisenumcolumn` enum('一式','*',[a few other japanese charactes]) CHARACTER SET sjis DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `version_id` (`version_id`)
) ENGINE=InnoDB AUTO_INCREMENT=946033 DEFAULT CHARSET=utf16 `
所以,表字符集UTF-16(原因我忘了),一个UTF8列,一个SJIS列。 在msyqldump文件中,我可以读取所有值,因此似乎在转储文件中所有编码方式都是相同的。
SELECT HEX(mytuf8column)
似乎确认myutf8column具有utf8编码(从下面提到的代码开始,即E383xx,Ewxxyy),并且mysjiscolumn具有以95开头的十六进制值,所以我猜它可能是sjis。
此外,在阅读this SOV question后,我检查并将max_allowed_packet
设置为33554432
,而不是默认设置,但这并没有改变问题。
执行加载的表的部分对于插入的数据没有明显问题,但由于数据太多,我无法真正查看db数据或mysqldump文件,并注意到可能存在的任何“奇怪”字符导致mysql陷入困境。 (mysqldump文件超过50MB,所以它不是很大的db标准,但足够大,非常麻烦阅读,Notepad ++和emacs似乎无能为力)
还有一件事,我很担心改变列整理,因为我不想丢失任何数据(如果当前编码错误,将其更改为另一种编码是否安全?)。解析原始数据花了很长时间,因此我正在尝试制作备份副本。编辑基于下面的答案,我不再为更改排序规则感到紧张,因为它只是比较的一个规则,而是我对改变字符集感到紧张。
顺便说一句,如果mysql需要简单地跳过一些有问题的行,那不是什么大问题。
“似乎在转储文件中所有编码都是相同的方式” - 你的意思是一些看起来正确编码在sjis中,一些在utf8中? –
回到这个错误,你能在“'randomimproperlydisplayingjapanesetext',''),(508715,134707'”)之前找到这些字符吗?这就是问题所在。或者,也许这个文本中的转义被玷污了(sjis )可能具有“'”作为有效字符的一个字节,这可能表示在倾倒sjis时mysqldump中的错误 –
@RickJames,(1)关于你的编码问题,我的意思是基本上mysqldump文件中的所有字符都是可读的,因此在* mysqldump文件内以相同的方式进行编码(对不起,也许这很明显)。(2)错误之前的文本是'INSERT INTO'troubletable'VALUES(x,x,x,x,x),(508715,134707'',但我认为问题是*之前显示的字符*错误语句,即在INSERT语句中的某个地方存在15000行这些记录没有被插入到数据库中现在我一次删除1000条记录来查找故障字符 – user4652310