我試了,導出的數(shù)據(jù)本來是有換行符號的,但是是linux格式的換行符。
創(chuàng)新互聯(lián)公司總部坐落于成都市區(qū),致力網(wǎng)站建設(shè)服務(wù)有網(wǎng)站設(shè)計制作、成都做網(wǎng)站、網(wǎng)絡(luò)營銷策劃、網(wǎng)頁設(shè)計、網(wǎng)站維護、公眾號搭建、微信小程序定制開發(fā)、軟件開發(fā)等為企業(yè)提供一整套的信息化建設(shè)解決方案。創(chuàng)造真正意義上的網(wǎng)站建設(shè),為互聯(lián)網(wǎng)品牌在互動行銷領(lǐng)域創(chuàng)造價值而不懈努力!
用記事本打開是沒法看到換行符,所以內(nèi)容都連成了一行。
所以你可以有兩個辦法:
1.用editplus打開文件去查看。
2.用查詢拼個可視分隔符在后面:
select CONCAT(name, '|') from table into outfile '/test.txt';
還是推薦你用editplus等這些比較專業(yè)的編輯器,windows自帶的那個記事本除了換行有問題,要是遇上utf8編碼的文件也會顯示亂碼,最好不要用它做數(shù)據(jù)處理。
可以用SUBSTRING_INDEX()函數(shù)
在mysql中提供了一些字符串操作的函數(shù),其中SUBSTRING_INDEX(str, delim, count)
str: 要處理的字符串
delim: 分割符
count: 計數(shù) 如果為正數(shù),則從左開始數(shù),如果為負數(shù),則從右開始數(shù)
mysql查詢含逗號的數(shù)據(jù),將逗號拆分為多行展示:
原始數(shù)據(jù)如下:
現(xiàn)在因為新的需求,需要將這些數(shù)據(jù)轉(zhuǎn)化為如下形式:
假設(shè)我們需要處理的表結(jié)構(gòu)為:
使用如下sql語句即可實現(xiàn)需求:
查詢的主要思路為,原表與一個包含連續(xù)自增長字段的表進行join,得到字符串分隔后的索引值,其中 length( a.name ) - length( REPLACE ( a.name, ',', '' ) ) + 1 語句獲得字符串逗號分隔之后得到的數(shù)據(jù)長度,兩表關(guān)聯(lián)之后,會得到相應行數(shù)的數(shù)據(jù)。比如,
在join之后會得到:
之后對查詢中的結(jié)果,使用substring_index方法進行截取,然后得到我們自己想要的數(shù)據(jù)。
在mysql中創(chuàng)表時分隔符怎么設(shè)置為tab:
1、load?data?local?infile??'test.csv'。
2、into?table?test_field?fields。
3、terminated?by?','。
4、lines?terminated?by?'\n'。
第一步,打開導入導出工具。(win7 32位系統(tǒng)下SQL自帶,64位系統(tǒng)下好像要裝)
第二步,選擇源文件的格式。這里txt格式文件選擇平面文件源。
第三步,瀏覽選擇文件源,其中代碼頁要改成簡體中文。另外在列中可查看導入的數(shù)據(jù)列是否正確,在高級中可編輯字段名。
第四步,選擇目標服務(wù)器和數(shù)據(jù)庫。就是確定數(shù)據(jù)文件要導入到哪一個一個服務(wù)器的哪一個數(shù)據(jù)庫中。
第五步,選擇目標表,打開編輯映射。默認時以文件名建立新表。
第六步,編輯映射。把數(shù)據(jù)對應導入數(shù)據(jù)庫各字段中!若是目標表是新建的,那么要編輯數(shù)據(jù)庫中的個字段名以及數(shù)據(jù)類型。
那么做完這些后只要數(shù)據(jù)源沒有問題,單擊下一步……就可以搞定了。
現(xiàn)在說說導入數(shù)據(jù)時要注意的地方。在導入txt格式的文件時首先需要注意數(shù)據(jù)的排列。每一列之間用統(tǒng)一的分隔符隔開,刪除無關(guān)的行信息。另外需要注意的是,txt格式的文件導入時空格也是被讀取的,所以要刪除空格。其實導入時我遇到的就這么點問題,卻足足卡了我一天半。數(shù)據(jù)按要求排列后如圖所示:
?
首先我們建立一張帶有逗號分隔的字符串。
CREATE TABLE test(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),pname VARCHAR(20) NOT NULL,pnum VARCHAR(50) NOT NULL);
然后插入帶有逗號分隔的測試數(shù)據(jù)
INSERT INTO test(pname,pnum) VALUES('產(chǎn)品1','1,2,4');
INSERT INTO test(pname,pnum) VALUES('產(chǎn)品2','2,4,7');
INSERT INTO test(pname,pnum) VALUES('產(chǎn)品3','3,4');
INSERT INTO test(pname,pnum) VALUES('產(chǎn)品4','1,7,8,9');
INSERT INTO test(pname,pnum) VALUES('產(chǎn)品5','33,4');
查找pnum字段中包含3或者9的記錄
mysql SELECT * FROM test WHERE find_in_set('3',pnum) OR find_in_set('9',pnum);
+----+-------+---------+
| id | pname | pnum |
+----+-------+---------+
| 3 | 產(chǎn)品3 | 3,4 |
| 4 | 產(chǎn)品4 | 1,7,8,9 |
+----+-------+---------+
2 rows in set (0.03 sec)
使用正則
mysql SELECT * FROM test WHERE pnum REGEXP '(3|9)';
+----+-------+---------+
| id | pname | pnum |
+----+-------+---------+
| 3 | 產(chǎn)品3 | 3,4 |
| 4 | 產(chǎn)品4 | 1,7,8,9 |
| 5 | 產(chǎn)品5 | 33,4 |
+----+-------+---------+
3 rows in set (0.02 sec)
這樣會產(chǎn)生多條記錄,比如33也被查找出來了,不過MYSQL還可以使用正則,挺有意思的
find_in_set()函數(shù)返回的所在的位置,如果不存在就返回0
mysql SELECT find_in_set('e','h,e,l,l,o');
+------------------------------+
| find_in_set('e','h,e,l,l,o') |
+------------------------------+
| 2 |
+------------------------------+
1 row in set (0.00 sec)
還可以用來排序,如下;
mysql SELECT * FROM TEST WHERE id in(4,2,3);
+----+-------+---------+
| id | pname | pnum |
+----+-------+---------+
| 2 | 產(chǎn)品2 | 2,4,7 |
| 3 | 產(chǎn)品3 | 3,4 |
| 4 | 產(chǎn)品4 | 1,7,8,9 |
+----+-------+---------+
3 rows in set (0.03 sec)
如果想要按照ID為4,2,3這樣排序呢?
mysql SELECT * FROM TEST WHERE id in(4,2,3) ORDER BY find_in_set(id,'4,2,3');
+----+-------+---------+
| id | pname | pnum |
+----+-------+---------+
| 4 | 產(chǎn)品4 | 1,7,8,9 |
| 2 | 產(chǎn)品2 | 2,4,7 |
| 3 | 產(chǎn)品3 | 3,4 |
+----+-------+---------+
3 rows in set (0.03 sec)