mysql数据库分隔符_MySQL对分隔符的处理(一)
MySQL的語法與標準SQL語法相同,默認使用分號“;”作為一條SQL語句結束的標志。且可以使用delimiter命令將其修改成其他符號,如:“delimiter |”。在MySQL看來所有的語句可以分為兩類,一類是SQL Statement(SQL語句),一類是Command Statement(系統命令)。
系統命令無需在語句結尾處添加分號直接回車即可,通常情況下長格式的系統命令在行尾添加分號不會影響命令的正常執行,如:use test;。習慣了每敲一條命令都打一個分號的管理員和程序員們現在注意了,分號不要隨便敲,MySQL在這里給我們挖了一個坑。
讓我們來看一個案例:
使用mysqldump命令導出一個名為"pp#idhuishou"的表,mysqldump -uroot -p test pp#idhuishou -r pp#idhuishou.sql,文件名與表名相同都含有一個井號。 使用SOURCE命令再導入數據的時候,我又習慣性的在結尾多打了一個分號,結果敲完分號再敲回車語句不執行,如果不敲分號,語句正常執行,數據被成功灌入,顯然是客戶端把井號后的內容當成注釋來處理了。
mysql> source pp#idhuishou.sql;
->
變通解決辦法:
使用輸入重定向的方式導入mysql -uroot -p test < pp#idhuishou.sql
將文件重命名再SOURCE,不包含井號就不會受分號影響mv pp#idhuishou.sql idhuishou.sql
讓我們分析一下MySQL倒底搞了什么鬼,MySQL處理一條語句首先要判斷這條語句是否為系統命令,如果是系統命令會有單獨的函數單獨處理,如: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函數用來判斷一條語句是否為系統命令 {
if ((*com->func)(&glob_buffer,line) > 0)
//*com->func為一個函數指針,分別指向不同命令的函數,如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)) //如果語句不是系統命令就會走到這里
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;
}
}
... ...
}
(未完待續)
總結
以上是生活随笔為你收集整理的mysql数据库分隔符_MySQL对分隔符的处理(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql explain 索引_MyS
- 下一篇: mysql 服务器初始面膜_安全初始化M