mysql数据库分隔符_MySQL对分隔符的处理(一)
MySQL的語法與標(biāo)準(zhǔn)SQL語法相同,默認(rèn)使用分號“;”作為一條SQL語句結(jié)束的標(biāo)志。且可以使用delimiter命令將其修改成其他符號,如:“delimiter |”。在MySQL看來所有的語句可以分為兩類,一類是SQL Statement(SQL語句),一類是Command Statement(系統(tǒng)命令)。
系統(tǒng)命令無需在語句結(jié)尾處添加分號直接回車即可,通常情況下長格式的系統(tǒng)命令在行尾添加分號不會影響命令的正常執(zhí)行,如:use test;。習(xí)慣了每敲一條命令都打一個分號的管理員和程序員們現(xiàn)在注意了,分號不要隨便敲,MySQL在這里給我們挖了一個坑。
讓我們來看一個案例:
使用mysqldump命令導(dǎo)出一個名為"pp#idhuishou"的表,mysqldump -uroot -p test pp#idhuishou -r pp#idhuishou.sql,文件名與表名相同都含有一個井號。 使用SOURCE命令再導(dǎo)入數(shù)據(jù)的時候,我又習(xí)慣性的在結(jié)尾多打了一個分號,結(jié)果敲完分號再敲回車語句不執(zhí)行,如果不敲分號,語句正常執(zhí)行,數(shù)據(jù)被成功灌入,顯然是客戶端把井號后的內(nèi)容當(dāng)成注釋來處理了。
mysql> source pp#idhuishou.sql;
->
變通解決辦法:
使用輸入重定向的方式導(dǎo)入mysql -uroot -p test < pp#idhuishou.sql
將文件重命名再SOURCE,不包含井號就不會受分號影響mv pp#idhuishou.sql idhuishou.sql
讓我們分析一下MySQL倒底搞了什么鬼,MySQL處理一條語句首先要判斷這條語句是否為系統(tǒng)命令,如果是系統(tǒng)命令會有單獨的函數(shù)單獨處理,如:com_warnings,com_use,com_source,com_help等。
Code:
static int read_and_execute(bool in interactive) {
for(;;) {
... ...
if ((named_cmds || glob_buffer.is_empty()) && !ml_comment && !in_string && (com=find_command(line,0)))
//find_command函數(shù)用來判斷一條語句是否為系統(tǒng)命令 {
if ((*com->func)(&glob_buffer,line) > 0)
//*com->func為一個函數(shù)指針,分別指向不同命令的函數(shù),如com_warnings,com_use,com_source,com_help等 break;
if (glob_buffer.is_empty()) // If buffer was emptied
in_string=0;
#ifdef HAVE_READLINE
if (interactive && status.add_to_history && not_in_history(line))
add_history(line);
#endif
continue;
}
if (add_line(glob_buffer,line,&in_string,&ml_comment)) //如果語句不是系統(tǒng)命令就會走到這里
break;
}
/* if in batch mode, send last query even if it doesn't end with \g or go */
if (!interactive && !status.exit_status)
{
remove_cntrl(glob_buffer);
if (!glob_buffer.is_empty())
{
status.exit_status=1;
if (com_go(&glob_buffer,line) <= 0)
status.exit_status=0;
}
}
... ...
}
(未完待續(xù))
總結(jié)
以上是生活随笔為你收集整理的mysql数据库分隔符_MySQL对分隔符的处理(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql explain 索引_MyS
- 下一篇: 苹果中国调整 iPhone、iPad 等