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('78,1,2,3',',')
傳回值:
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('8,9,4',',',2)
傳回值:
9
1.3. 結合以上兩個函數,遍歷數組中的元素
方法:結合上邊兩個函數,像數組一樣遍歷字串中的元素
<code>declare @str varchar(50) <br/>set @str='1,2,3,4,5' <br/>declare @next int <br/>set @next=1 <br/>while @next<=Get_StrArrayLength(@str,',') <br/>begin <br/>print Get_StrArrayStrOfIndex(@str,',',@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中文網其他相關文章!

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

MySQL是一個開源的關係型數據庫管理系統,適用於數據存儲、管理、查詢和安全。 1.它支持多種操作系統,廣泛應用於Web應用等領域。 2.通過客戶端-服務器架構和不同存儲引擎,MySQL高效處理數據。 3.基本用法包括創建數據庫和表,插入、查詢和更新數據。 4.高級用法涉及復雜查詢和存儲過程。 5.常見錯誤可通過EXPLAIN語句調試。 6.性能優化包括合理使用索引和優化查詢語句。

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

InnoDB的鎖機制包括共享鎖、排他鎖、意向鎖、記錄鎖、間隙鎖和下一個鍵鎖。 1.共享鎖允許事務讀取數據而不阻止其他事務讀取。 2.排他鎖阻止其他事務讀取和修改數據。 3.意向鎖優化鎖效率。 4.記錄鎖鎖定索引記錄。 5.間隙鎖鎖定索引記錄間隙。 6.下一個鍵鎖是記錄鎖和間隙鎖的組合,確保數據一致性。

MySQL查询性能不佳的原因主要包括没有使用索引、查询优化器选择错误的执行计划、表设计不合理、数据量过大和锁竞争。1.没有索引导致查询缓慢,添加索引后可显著提升性能。2.使用EXPLAIN命令可以分析查询计划,找出优化器错误。3.重构表结构和优化JOIN条件可改善表设计问题。4.数据量大时,采用分区和分表策略。5.高并发环境下,优化事务和锁策略可减少锁竞争。

在數據庫優化中,應根據查詢需求選擇索引策略:1.當查詢涉及多個列且條件順序固定時,使用複合索引;2.當查詢涉及多個列但條件順序不固定時,使用多個單列索引。複合索引適用於優化多列查詢,單列索引則適合單列查詢。

要優化MySQL慢查詢,需使用slowquerylog和performance_schema:1.啟用slowquerylog並設置閾值,記錄慢查詢;2.利用performance_schema分析查詢執行細節,找出性能瓶頸並優化。

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SublimeText3 Linux新版
SublimeText3 Linux最新版