>  기사  >  데이터 베이스  >  mysql에 배열이 있나요?

mysql에 배열이 있나요?

青灯夜游
青灯夜游원래의
2023-03-30 20:15:422304검색

MySQL에는 배열 유형이 없습니다. 배열 요소는 일반적으로 특정 문자로 구분되어 문자열 형식으로 저장됩니다. MYSQL에 배열이 없는 이유는 대부분의 사람들이 실제로 배열을 필요로 하지 않기 때문입니다. 관계형 데이터베이스는 관계를 사용하여 작동하며 대부분의 경우 각 "정보 비트"에 대해 테이블의 한 행을 갖는 것이 가장 좋습니다. 예를 들어, "나는 사물의 목록을 원한다"고 생각하고 대신 한 테이블의 행을 다른 테이블의 행과 연결하는 새 테이블을 만들 수 있습니다. 이는 "M:N" 관계를 나타낼 수 있습니다. 데이터베이스는 이러한 행을 색인화할 수 있습니다. 일반적으로 배열은 색인화되지 않습니다.

mysql에 배열이 있나요?

이 튜토리얼의 운영 환경: windows7 시스템, mysql8 버전, Dell G3 컴퓨터.

1. MySQL에서는 배열이 문자열 형태로 저장됩니다.

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(&#39;78,1,2,3&#39;,&#39;,&#39;)
반환값:
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(&#39;8,9,4&#39;,&#39;,&#39;,2)
반환 값:
9

1.3 위의 두 함수를 결합하여 요소를 탐색합니다. array

메소드: 위의 두 함수를 결합하여 array

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

처럼 문자열의 요소를 순회합니다.

调用结果:

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视频教程

위 내용은 mysql에 배열이 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.