首頁  >  文章  >  資料庫  >  mysql有沒有數組

mysql有沒有數組

WBOY
WBOY轉載
2023-06-03 12:04:361212瀏覽

MySQL中無數組類型,通常將陣列元素以某個字元分割以字串形式儲存。 MYSQL中沒有陣列的原因是因為大多數人其實不需要它。在關係型資料庫中,通常使用關聯式模型,每個資訊單元最好分配給單獨的表格行。例如,可能認為“我想要一個東西列表”,而是創建一個新表,將一個表中的行與另一個表中的行相關聯;這樣可以表示“M:N”關係。資料庫可以索引這些行;而陣列通常不會編入索引。

1. MySQL中以字串的形式儲存數組

MySQL中無數組類型,通常會將陣列元素以某個字元分割以字串形式儲存

1.1. 求陣列中元素的個數

#方法:依指定符號分割字串,傳回分割後的元素個數。要求的結果可以透過計算字串中的分隔符號數量並加上1來得到,方法非常簡單。

<code>CREATE function Get_StrArrayLength <br/>( <br/>@str varchar(1024), --要分割的字符串 <br/>@split varchar(10) --分隔符号 <br/>) <br/>returns int <br/>as <br/>begin <br/>declare @location int <br/>declare @start int <br/>declare @length int <br/>set @str=ltrim(rtrim(@str)) <br/>set @location=charindex(@split,@str) <br/>set @length=1 <br/>while @location<>0 <br/>begin <br/>set @start=@location+1 <br/>set @location=charindex(@split,@str,@start) <br/>set @length=@length+1 <br/>end <br/>return @length <br/>end<br/></code>

呼叫範例:

select  Get_StrArrayLength(&#39;78,1,2,3&#39;,&#39;,&#39;)

傳回值:

4

1.2. 得到陣列中指定位置的元素

方法:依指定符號分割字串,傳回分割後指定索引的第幾個元素(注意索引從1開始),像數組一樣方便

<code>CREATE function Get_StrArrayStrOfIndex <br/>( <br/>@str varchar(1024), --要分割的字符串 <br/>@split varchar(10), --分隔符号 <br/>@index int --取第几个元素 <br/>) <br/>returns varchar(1024) <br/>as <br/>begin <br/>declare @location int <br/>declare @start int <br/>declare @next int <br/>declare @seed int <br/>set @str=ltrim(rtrim(@str)) <br/>set @start=1 <br/>set @next=1 <br/>set @seed=len(@split) <br/>set @location=charindex(@split,@str) <br/>while @location<>0 and @index>@next <br/>begin <br/>set @start=@location+@seed <br/>set @location=charindex(@split,@str,@start) <br/>set @next=@next+1 <br/>end <br/>if @location =0 select @location =len(@str)+1 <br/>--这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。 <br/>return substring(@str,@start,@location-@start) <br/>end<br/></code>

呼叫範例:

select  Get_StrArrayStrOfIndex(&#39;8,9,4&#39;,&#39;,&#39;,2)

傳回值:

9

1.3. 結合以上兩個函數,遍歷數組中的元素

方法:結合上邊兩個函數,像數組一樣遍歷字串中的元素

<code>declare @str varchar(50) <br/>set @str=&#39;1,2,3,4,5&#39; <br/>declare @next int <br/>set @next=1 <br/>while @next<=Get_StrArrayLength(@str,&#39;,&#39;) <br/>begin <br/>print Get_StrArrayStrOfIndex(@str,&#39;,&#39;,@next) <br/>set @next=@next+1 <br/>end<br/></code>

呼叫結果:

1
2
3
4
5

2.MySQL中儲存數組(list)的範例

我在MySQL中有兩個表。表Person具有以下列:

id | name | fruits

水果列可以包含空或像(‘apple’,’orange’,’banana’)或(‘strawberry’)等的字串陣列。第二個表是Table Fruit,有以下三列:

____________________________
fruit_name | color  | price
____________________________
apple      | red    | 2
____________________________
orange     | orange | 3
____________________________
...,...

那麼我應該如何設計第一個表中的fruits列,以便它可以容納從第二個表中的fruit_name列取得值的字串數組?由於MySQL中沒有數組資料類型,我該怎麼辦呢?

最佳答案:

正確的方法是使用多個表,並在查詢中加入它們。

例如:

CREATE TABLE person (
`id` INT NOT NULL PRIMARY KEY,
`name` VARCHAR(50)
);
 
CREATE TABLE fruits (
`fruit_name` VARCHAR(20) NOT NULL PRIMARY KEY,
`color` VARCHAR(20),
`price` INT
);
 
CREATE TABLE person_fruit (
`person_id` INT NOT NULL,
`fruit_name` VARCHAR(20) NOT NULL,
PRIMARY KEY(`person_id`, `fruit_name`)
);

person_fruit表格包含一個人與其相關聯的每個水果的一行,並且有效地將人和水果表連結在一起。

1 | "banana"
1 | "apple"
1 | "orange"
2 | "straberry"
2 | "banana"
2 | "apple"

當你想檢索一個人和他們的水果,你可以做這樣的事情:

SELECT p.*, f.*
FROM person p
INNER JOIN person_fruit pf
ON p.id = pf.person_id
INNER JOIN fruits f
ON pf.fruit_name = f.fruit_name

說明一:

SQL中沒有陣列的原因是因為大多數人其實不需要它。關聯式資料庫(SQL就是這樣)使用關係式工作,大多數情況下,最好是為每個「資訊位元」分配一行表。 例如,你可能認為“我想要一個東西#列表”,而是創建一個新表,將一個表中的行與另一個表中的行相關聯[1] 這樣,您可以表示M:N關係。另一個優點是這些連結不會使包含連結項目的行混亂。資料庫可以索引這些行。數組通常不會編入索引。

如果您不需要關聯式資料庫,則可以使用例如鍵值儲存。

」的訊息。 重寫後的句子: 根據黃金法則,對於密鑰和整個密鑰事實,每個非關鍵屬性都必須提供相應的資訊。 」 陣列做得太多了。它有多個事實,它儲存訂單(與關係本身無關)。效能很差(見上文)。

想像一下,你有一張人桌,你有一張桌子,可以讓人打電話。現在你可以讓每個人都有他的電話清單。但每個人與許多其他事物有許多其他關係。這是否意味著我的人員表應該包含他連接的每一件事物的陣列?不,這不是這個人本身的屬性。

[1]:如果連結表只有兩列(每個表的主鍵),這沒關係!如果關係本身俱有其他屬性,則應在此表中將其表示為列。

說明二:

MySQL 5.7現在提供JSON資料類型。這種新的資料類型提供了一種存儲複雜資料的便捷新方法:列表,字典等。

物件關聯映射可能非常複雜,因為Rrays 不能有效地對應到資料庫。在MySQL中,歷史上人們通常透過建立表格來儲存列表或陣列,並將每個值作為記錄添加。該表可能只有2或3列,或者可能包含更多列。如何儲存此類資料實際上取決於資料的特徵。

例如,列表是否包含靜態或動態條目數?該列表是否會保持較小,或者預計會增長到數百萬條記錄?這張桌子上會有很多讀物嗎?很多寫作?很多更新?在決定如何存儲數據集合時,這些都是需要考慮的因素。

此外,金鑰:價值資料儲存/檔案存儲,如Cassandra,MongoDB,Redis等也提供了一個很好的解決方案。請注意資料實際儲存的位置(如果儲存在磁碟或記憶體中)。並非所有資料都需要位於同一資料庫中。某些資料無法很好地對應到關聯式資料庫,您可能有理由將其儲存在其他位置,或者您可能希望使用記憶體中的鍵:值資料庫作為儲存在磁碟某處或作為暫存的資料的熱緩存像會話這樣的東西。

以上是mysql有沒有數組的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除