您好,登錄后才能下訂單哦!
這篇文章主要介紹“mysql有沒有數組”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“mysql有沒有數組”文章能幫助大家解決問題。
MySQL中無數組類型,通常將數組元素按某個字符分割以字符串形式存儲。MYSQL中沒有數組的原因是因為大多數人并不真正需要它。關系數據庫使用關系工作,并且大多數情況下,最好是為每個“信息位”分配一行表。例如,可能認為“我想要一個東西列表”,而是創建一個新表,將一個表中的行與另一個表中的行相關聯;這樣可以表示“M:N”關系。數據庫可以索引這些行;而數組通常不會編入索引。
MySQL中無數組類型,通常將數組元素按某個字符分割以字符串形式存儲
1.1. 求數組中元素的個數
方法:按指定符號分割字符串,返回分割后的元素個數。方法很簡單,就是看字符串中存在多少個分隔符號,然后再加一,就是要求的結果。
CREATE function Get_StrArrayLength
(
@str varchar(1024), --要分割的字符串
@split varchar(10) --分隔符號
)
returns int
as
begin
declare @location int
declare @start int
declare @length int
set @str=ltrim(rtrim(@str))
set @location=charindex(@split,@str)
set @length=1
while @location<>0
begin
set @start=@location+1
set @location=charindex(@split,@str,@start)
set @length=@length+1
end
return @length
end
調用示例:
select Get_StrArrayLength('78,1,2,3',',')
返回值:
4
1.2. 得到數組中指定位置的元素
方法:按指定符號分割字符串,返回分割后指定索引的第幾個元素(注意索引從1開始),象數組一樣方便
CREATE function Get_StrArrayStrOfIndex
(
@str varchar(1024), --要分割的字符串
@split varchar(10), --分隔符號
@index int --取第幾個元素
)
returns varchar(1024)
as
begin
declare @location int
declare @start int
declare @next int
declare @seed int
set @str=ltrim(rtrim(@str))
set @start=1
set @next=1
set @seed=len(@split)
set @location=charindex(@split,@str)
while @location<>0 and @index>@next
begin
set @start=@location+@seed
set @location=charindex(@split,@str,@start)
set @next=@next+1
end
if @location =0 select @location =len(@str)+1
--這兒存在兩種情況:1、字符串不存在分隔符號 2、字符串中存在分隔符號,跳出while循環后,@location為0,那默認為字符串后邊有一個分隔符號。
return substring(@str,@start,@location-@start)
end
調用示例:
select Get_StrArrayStrOfIndex('8,9,4',',',2)
返回值:
9
1.3. 結合以上兩個函數,遍歷數組中的元素
方法:結合上邊兩個函數,象數組一樣遍歷字符串中的元素
declare @str varchar(50)
set @str='1,2,3,4,5'
declare @next int
set @next=1
while @next<=Get_StrArrayLength(@str,',')
begin
print Get_StrArrayStrOfIndex(@str,',',@next)
set @next=@next+1
end
調用結果:
1
2
3
4
5
我在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有沒有數組”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。