ERROR 3140 (22032): Invalid JSON text: "The document root must not be followed by other values." at position 150 in value for column '컬럼명'.


에러 환경

 

Client OS: Windows10

Server OS: Ubuntu 22.04.2 LTS

MySQL: 8.0.30


에러 원인

 

'컬럼명'의 150번째 위치에서 Json 문법이 잘못되었을때 발생합니다.


해결 방안

 

잘못된 Json 문법을 수정합니다.

 

잘못된 유형

 

1. 따옴표 누락

# 에러
{ "name:  "ruru" }

# 정상
{ "name": "ruru" }

 

2. 배열일 경우 대괄호 누락

#에러
{ "name": "ruru" }, { "name": "baba" }

# 정상
[{ "name": "ruru" }, { "name": "baba" }]

 

3. 배열일 경우 콤마 누락

# 에러 1
[{ "name": "ruru" } { "name": "baba" }]
# 에러 2
{ "name": [ "ruru" "baba" ] }

# 정상 1
[{ "name": "ruru" }, { "name": "baba" }]
# 정상 2
{ "name": [ "ruru", "baba" ] }

 

4. Json 중괄호 누락

# 에러
{ "name": "ruru"
# 정상
{ "name": "ruru" }

등등 여러가지 이유로 에러가 날 수 있습니다.


마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

 

테이블 최근 수정일, 갱신일 확인

 

이번에는 테이블 마지막 업데이트 시간을 알고 싶을때 사용하는 방법에 대해 알아보겠습니다.


주의사항

 

MySQL 5.7버전 이하에는 InnoDB에 버그가 있어 정상적으로 UPDATE_TIME을 불러올수 없는 이슈가 있습니다.

또한 서버가 다시 시작되거나 테이블이 InnoDB 데이터 사전 캐시에서 제거되면 타임스탬프가 유지되지 않아 정상적으로 사용할 수 없습니다.

 

그래서 방법3에 직접 시간을 관리하는 방법도 같이 서술해놓겠습니다.


방법1. SHOW TABLE STATUS

 

SHOW TABLE STATUS LIKE '테이블명';
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
| Name       | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time | Collation          | Checksum | Create_options | Comment |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
| test       | InnoDB |      10 | Dynamic    |    1 |          16384 |       16384 |               0 |            0 |         0 |           NULL | 2024-03-27 09:38:55 | 2024-03-27 09:39:05 | NULL       | utf8mb4_unicode_ci |     NULL |                |         |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+

 


방법2. INFORMATION_SCHEMA.TABLES

 

DB명과 테이블명으로 확인

SELECT UPDATE_TIME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DB명'
	AND TABLE_NAME = '테이블명';
+---------------------+
| UPDATE_TIME         |
+---------------------+
| 2024-03-27 09:39:05 |
+---------------------+

 

테이블명으로 확인

SELECT UPDATE_TIME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME='테이블명';
+---------------------+
| UPDATE_TIME         |
+---------------------+
| 2024-03-27 09:39:05 |
+---------------------+

방법3. 직접 업데이트 시간 관리하기

 

CREATE TABLE test (
	id INT PRIMARY KEY,
	name CHAR(4),
	update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
			ON UPDATE CURRENT_TIMESTAMP,
	KEY (update_time)
);

 

테스트 테이블 test가 생성하겠습니다.

test에는 id와 name, 업데이트 시간을 관리하는 update_time 컬럼이 있습니다.

 

INSERT INTO test(id, update_time) VALUES (1, NOW());

SELECT * FROM test;
+----+------+---------------------+
| id | name | update_time         |
+----+------+---------------------+
|  1 | NULL | 2024-03-28 09:47:24 |
+----+------+---------------------+

 

위와같이 데이터를 넣으며 update_time을 관리해줍니다.

 

UPDATE test SET name = 'test' WHERE id = 1;

SELECT * FROM test;
+----+------+---------------------+
| id | name | update_time         |
+----+------+---------------------+
|  1 | test | 2024-03-28 09:50:22 |
+----+------+---------------------+

  

UPDATE를 하면 자동으로 update_time이 갱신됩니다.

 

SELECT MAX(update_time) FROM test;
+---------------------+
| MAX(update_time)    |
+---------------------+
| 2024-03-28 09:50:22 |
+---------------------+

 

테이블의 마지막 업데이트 시간을 보고싶으면 MAX 함수를 사용하여 확인할 수 있습니다.


마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

ERROR 1317 (70100): Query execution was interrupted


에러 환경

 

Client OS: Windows10

Server OS: Ubuntu 22.04.2 LTS

MySQL: 8.0.30


에러 원인

 

쿼리 처리시간이 너무 오래걸리거나 서버에 이상이 있어 쿼리를 정상적으로 실행을 할수없을 때 나타나는 에러입니다.


해결 방안

 

방법1.

MySQL 서버를 재시작합니다. 그리고 해결되었는지 확인합니다.

 

방법2.

SELECT 를 하거나 INSERT, UPDATE를 할 때 인덱스 사용유무에 따라 실행속도를 향상시킬수 있습니다.

# 인덱스 활성화
ALTER TABLE 테이블명 ENABLE KEYS;

# 인덱스 비활성화
ALTER TABLE 테이블명 DISABLE KEYS;

 

방법3.

max_allowed_packet는 서버와 클라이언트 사이에 주고받는 패킷의 사이즈를 설정하는 값으로 사이즈를 늘려 속도를 향상시킬 수 있습니다.

# max_allowed_packet 사이즈 확인
SHOW VARIABLES WHERE variable_name = 'max_allowed_packet';
+--------------------+----------+
| Variable_name      | Value    |
+--------------------+----------+
| max_allowed_packet | 67108864 |
+--------------------+----------+

# max_allowed_packet 사이즈 변경 ex)64Mb
SET GLOBAL max_allowed_packet = 64*1024*1024;

 

또는 my.ini 파일을 통해서도 변경할 수 있습니다.


마무리

 

공통적으로 해결할 수 있는 방법을 작성해보았습니다. 이외에도 연산시간이 오래걸리거나 루프가 너무 많아 오래걸리는 쿼리문같은 경우 적절한 수정을 통해 해결하면 좋을 것 같습니다.

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

 

ERROR 1062 (23000): Duplicate entry '' for key 'PRIMARY'


에러 원인

 

INSERT 또는 UPDATE 할 때 중복된 PK값이 있을 때 발생합니다.


해결 방안

 

중복된 값이 있는지 확인하고 다시 작업을 합니다.

SELECT * FROM 테이블
WHERE 컬럼명 = '중복 체크 값'

 


마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

 

ERROR 3141 (22032): Invalid JSON text in argument 1 to function json_contains: "Invalid value." at position 0.


에러 환경

 

Client OS: Windows10

Server OS: Ubuntu 22.04.2 LTS

MySQL: 8.0.30


에러 원인

 

JSON_CONTAINS 함수 사용할 때 인자값이 잘못되어 발생하는 에러입니다.

대부분 작은 따옴표('), 큰 따옴표(")를 잘못써서 발생합니다.


해결 방안

 

JSON_CONTAINS('컬럼', '1')

 

함수 파라미터를 전달할 때 작은 따옴표(')를 사용합니다.

 

JSON_CONTAINS('컬럼','"문자열"')

 

문자열을 전달할 때는 큰 따옴표(") 를 사용하고 다시 작음 따옴표(')로 감싸줘야 합니다. 


마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

Json, 다중 Json 데이터 WHERE문 검색하기

 

MySQL 5.7 버전부터는 Json 타입의 데이터를 사용할 수 있습니다. Json 타입의 데이터를 검색하는 방법에 대해 알아봅시다.


테스트용 테이블 만들기

 

테이블 생성

# 테이블 생성 #
CREATE TABLE json_test (
	name varchar(8),
	data json
)

Query OK, 0 rows affected (0.01 sec)

# 테이블 확인 #
DESC json_test;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| name  | varchar(8) | YES  |     | NULL    |       |
| data  | json       | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+

2 rows in set (0.00 sec)

 

데이터 추가

# 데이터 추가 #
INSERT INTO json_test(name, data) VALUE ('test0','{"id":0, "value": { "name": "a", "array": [0, 2] } }');
INSERT INTO json_test(name, data) VALUE ('test1','{"id":1, "value": { "name": "b", "array": [0, 3] } }');
INSERT INTO json_test(name, data) VALUE ('test2','{"id":2, "value": { "name": "c", "array": [1, 2] } }');

# 데이터 확인 #
SELECT * FROM json_test;
+-------+----------------------------------------------------+
| name  | data                                               |
+-------+----------------------------------------------------+
| test0 | {"id": 0, "value": {"name": "a", "array": [0, 2]}} |
| test1 | {"id": 1, "value": {"name": "b", "array": [0, 3]}} |
| test2 | {"id": 2, "value": {"name": "c", "array": [1, 2]}} |
+-------+----------------------------------------------------+
3 rows in set (0.00 sec)

테스트용 테이블 검색하기

 

Json 검색

SELECT * FROM json_test
WHERE data->"$.id" = 0;
+-------+----------------------------------------------------+
| name  | data                                               |
+-------+----------------------------------------------------+
| test0 | {"id": 0, "value": {"name": "a", "array": [0, 2]}} |
+-------+----------------------------------------------------+
1 row in set (0.00 sec)

 

Json 타입 컬럼명 -> "$.필드이름" 형식을 이용하여 Json 데이터에 접근할 수 있습니다.

 

다중 Json 검색

SELECT * FROM json_test
WHERE data->"$.value.name" = "c";
+-------+----------------------------------------------------+
| name  | data                                               |
+-------+----------------------------------------------------+
| test2 | {"id": 2, "value": {"name": "c", "array": [1, 2]}} |
+-------+----------------------------------------------------+
1 row in set (0.00 sec)

 

Json 타입 컬럼명 -> "$.필드이름.필드이름" 형식을 이용하여 Json 속 Json 데이터에 접근할 수 있습니다.

 

Json 속 배열 검색

SELECT * FROM json_test
WHERE data->"$.value.array[0]" = 0;
+-------+----------------------------------------------------+
| name  | data                                               |
+-------+----------------------------------------------------+
| test0 | {"id": 0, "value": {"name": "a", "array": [0, 2]}} |
| test1 | {"id": 1, "value": {"name": "b", "array": [0, 3]}} |
+-------+----------------------------------------------------+
2 rows in set (0.00 sec)

 

Json 타입 컬럼명 -> "$.필드이름[n]" 형식을 이용하여 Json 속 배열 n번째 데이터에 접근할 수 있습니다.

 

Json 속 배열 전체 내 검색

SELECT * FROM json_test
WHERE JSON_CONTAINS(data->"$.value.array",'2');
+-------+----------------------------------------------------+
| name  | data                                               |
+-------+----------------------------------------------------+
| test0 | {"id": 0, "value": {"name": "a", "array": [0, 2]}} |
| test2 | {"id": 2, "value": {"name": "c", "array": [1, 2]}} |
+-------+----------------------------------------------------+
2 rows in set (0.00 sec)

 

JSON_CONTAINS(배열,값) 함수를 이용하여 특정값 배열이 있는 데이터를 찾을 수 있습니다.


마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

 

ERROR 3948 (42000): Loading local data is disabled; this must be enabled on both the client and server side


에러 환경

 

Client OS: Windows10

Server OS: Ubuntu 22.04.2 LTS

MySQL: 8.0.30


에러 원인

 

LOAD DATA LOCAL 명령어 사용시 서버측에서 권한이 없을때 발생합니다.


해결 방안

 

1. local_infile 권한이 있는지 확인합니다.

SHOW GLOBAL VARIABLES LIKE 'local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

 

2. local_infile 권한이 OFF이면 명령어를 사용하여 ON으로 변경합니다.

SET GLOBAL local_infile=1;
Query OK, 0 rows affected (0.00 sec)

SHOW GLOBAL VARIABLES LIKE 'local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | ON    |
+---------------+-------+
1 row in set (0.00 sec)

 

3. 테스트

LOAD DATA LOCAL
	INFILE 'TEST_DATA.CSV'
INTO TABLE
	`test_data_info`
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 0 LINES;
Query OK, 2964908 rows affected (20.86 sec)

연관성 있는 다른 에러

 

클라이언트측 local_infile 권한 문제

 

[MySQL] ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.

ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access. 에러 환경 Client OS: Windows10 Server OS: Ubuntu 22.04.2 LTS MySQL: 8.0.30 에러 원인 LOAD DATA LOCAL 명령어 사용시 클라이언트측 CMD가 관

rurustory.com


마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

 

728x90
반응형

 

ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.


에러 환경

 

Client OS: Windows10

Server OS: Ubuntu 22.04.2 LTS

MySQL: 8.0.30


에러 원인

 

LOAD DATA LOCAL 명령어 사용시 클라이언트측 CMD가 관리자권한이 없거나 --local-infile 권한이 없을때 발생합니다.


해결 방안

 

1. CMD 실행시 관리자 권한으로 실행시킵니다.

 

2. MySQL 접속시 --local-infile 옵션을 넣고 접속합니다.

mysql.exe --local-infile -u <유저> -p <DB명> -h <서버호스트> -P <접속포트>

 

3. 테스트

LOAD DATA LOCAL
	INFILE 'TEST_DATA.CSV'
INTO TABLE
	`test_data_info`
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 0 LINES;
Query OK, 2964908 rows affected (20.86 sec)

연관성 있는 다른 에러

 

서버측 local_infile 권한 문제

 

[MySQL] ERROR 3948 (42000): Loading local data is disabled; this must be enabled on both the client and server side

ERROR 3948 (42000): Loading local data is disabled; this must be enabled on both the client and server side 에러 환경 Client OS: Windows10 Server OS: Ubuntu 22.04.2 LTS MySQL: 8.0.30 에러 원인 LOAD DATA LOCAL 명령어 사용시 서버측에서 권

rurustory.com


마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

+ Recent posts