해시 비밀번호 데이터 유형의 기본 원리MySQL에서 해시된 비밀번호를 저장할 때 적합한 데이터 유형은 사용하는 해싱 알고리즘의 종류에 따라 달라집니다. 해싱 알고리즘은 입력값의 크기와 무관하게 항상 동일한 길이의 결과를 생성하므로, 원본 비밀번호의 길이는 데이터 유형 선택에 영향을 주지 않습니다.해시 결과는 일련의 16진수(hexadecimal) 문자열로 출력되며, UNHEX() 함수를 활용하면 이 16진수 문자열을 절반 길이의 바이너리(binary) 값으로 변환하여 더 효율적으로 저장할 수 있습니다.대표적인 해싱 알고리즘별 권장
Python에서 MySQL 데이터베이스에 연결하려면 MySQLdb 모듈이 필요합니다. 이 모듈을 정상적으로 설치하고 사용하려면 먼저 최신 버전의 Python(3.7 이상 권장)이 시스템에 설치되어 있어야 합니다. 1단계: pip가 있는 Python Scripts 폴더 찾기 MySQLdb 모듈은 pip 명령어를 통해 설치할 수 있습니다. 따라서 가장 먼저 pip 명령어가 위치한 Python Scripts 폴더의 경로를 확인해야 합니다. 명령 프롬프트(cmd)를 열려면 키보드에서 Windows + R 키를 동시에 누른 뒤, 실행 창에
MySQL에서 JSON 데이터 타입으로 데이터 저장하기MySQL에서는 JSON 데이터 타입을 활용하여 데이터를 JSON 형식 그대로 저장할 수 있습니다. JSON 타입은 MySQL 5.7.8 버전부터 공식 지원되며, 구조가 유연하거나 스키마가 자주 변경되는 데이터를 저장할 때 특히 유용합니다.1. 테이블 생성하기먼저 JSON 컬럼을 포함하는 테이블을 생성해 보겠습니다.mysql> CREATE table JsonAsMySQLDemo-> (-> id int,-> name varchar(100),-> PageD
MySQL에서 EXISTS는 쿼리가 결과를 반환했는지 여부만 확인하는 반면, IN은 하나의 값을 다른 값들과 비교할 때 사용합니다. 특히 IN은 리터럴(literal) 값을 기반으로 동작한다는 점이 특징입니다.EXISTS와 IN의 선택 기준핵심 원칙: 서브쿼리의 결과 집합이 매우 작을 때는 IN이 선호되며, 서브쿼리 결과가 매우 클 경우에는 EXISTS를 사용하는 것이 효율적입니다.그 이유는 간단합니다. IN은 서브쿼리의 전체 결과를 먼저 생성한 뒤 외부 쿼리의 값과 비교하기 때문에, 결과 집합이 작을 때 빠른 성능을 보입니다. 반
MySQL 저장 프로시저에 배열 전달하기MySQL은 다른 프로그래밍 언어와 달리 배열(Array) 타입을 기본적으로 지원하지 않습니다. 하지만 콤마로 구분된 문자열과 FIND_IN_SET() 함수를 활용하면 배열과 유사한 방식으로 여러 값을 저장 프로시저(Stored Procedure)에 전달할 수 있습니다. 이번 글에서는 실제 예제를 통해 그 방법을 단계별로 알아보겠습니다.1단계: 예제용 테이블 생성먼저 실습에 사용할 테이블을 생성합니다.mysql> create table FindDemo -> ( -> na
MySQL 자동 증가 ID의 조각화란?데이터베이스 테이블의 레코드에 고유한 ID를 부여할 때, 번호를 다시 매기는 과정에서 여러 가지 문제가 발생할 수 있습니다. 특히 MySQL에서 자동 증가(AUTO_INCREMENT) ID는 특정 조건에 따라 값이 재사용되거나 중간에 빈 공간이 생기는데, 이를 ID 조각화(fragmentation)라고 합니다.AUTO_INCREMENT ID가 재사용될 수 있는 상황MySQL 5.6 버전의 InnoDB 스토리지 엔진에서는 INSERT 문에 ID 열을 직접 포함하고 원하는 특정 값을 지정하면 aut
개요단일 데이터베이스를 사용하는 프로젝트에서는 스키마 버전 관리(schema versioning) 또는 마이그레이션(migration) 기법을 활용해 데이터베이스 스키마 변경을 수행할 수 있습니다. 이 방식의 목적은 데이터베이스의 구조적 변경 사항을 체계적으로 기록하고 추적하여, 언제 어떤 변경이 적용되었는지 명확히 파악할 수 있도록 하는 것입니다.1. 스키마 변경 이력 저장용 테이블 생성먼저 스키마 변경 사항을 기록할 전용 테이블을 생성합니다. 아래 예제에서는 변경 시점(WhenTime), 식별 키(TheKey), 버전 정보(Ve
MySQL DECIMAL 데이터 타입이란?MySQL의 DECIMAL 데이터 타입은 소수점 오차 없이 정확한 숫자 값을 저장할 때 사용합니다. 급여, 가격, 금액처럼 정확성이 중요한 숫자 데이터를 다룰 때는 FLOAT나 DOUBLE보다 DECIMAL을 사용하는 것이 안전합니다.DECIMAL 기본 문법yourColumnName DECIMAL(전체_자릿수, 소수점_이하_자릿수);예를 들어 DECIMAL(6,2)는 전체 6자리 중 소수점 이하 2자리를 의미하며, 정수 부분은 최대 4자리까지 저장할 수 있습니다. 즉, 저장 가능한 값의 범위
MySQL에서 이미 생성된 테이블의 기존 필드(컬럼)를 고유하게 만들려면 ALTER 명령어를 사용하여 해당 필드에 UNIQUE 제약 조건을 추가하면 됩니다. 이번 글에서는 실제 예제를 통해 그 과정을 단계별로 살펴보겠습니다.1. 테이블 생성하기먼저 예제로 사용할 테이블을 생성합니다. mysql> create table AddingUnique -> ( -> Id int, -> name varchar(100) -> ); Query OK, 0 rows affected (0.44 sec) 2
MySQL의 현재 시간대 조회하기MySQL에서 설정된 현재 시간대(time zone)를 확인하려면 시스템 변수인 @@global.time_zone과 @@session.time_zone을 함께 조회하면 됩니다. 전역(global) 시간대와 세션(session) 시간대가 각각 어떻게 설정되어 있는지 한 번에 파악할 수 있어 매우 유용합니다.1. 시스템 변수로 시간대 확인아래는 MySQL의 현재 시간대를 조회하는 기본 문법입니다.mysql> SELECT @@global.time_zone, @@session.time_zone;위 쿼리
MySQL에서 특정 날짜에 1일을 추가해야 하는 경우가 종종 있습니다. 예를 들어 만료일 계산, 배송 예정일 산정, 예약 시스템 구현 등 다양한 상황에서 날짜 연산이 필요합니다. 이럴 때 DATE_ADD() 함수를 사용하면 간단하게 해결할 수 있습니다.DATE_ADD() 함수란?DATE_ADD() 함수는 기준 날짜에 지정한 시간 간격(INTERVAL)을 더하는 MySQL의 내장 함수입니다. 기본 문법은 다음과 같습니다.DATE_ADD(날짜, INTERVAL 값 단위)단위는 DAY, MONTH, YEAR, HOUR, MINUTE 등
JavaScript에서 생성한 날짜와 시간 데이터를 MySQL 데이터베이스에 저장하려면, MySQL이 인식하는 YYYY-MM-DD HH:MM:SS 형식으로 변환해야 합니다. 이때 가장 간단하게 활용할 수 있는 방법이 바로 자바스크립트의 toISOString() 함수입니다.toISOString() 함수란?toISOString()은 Date 객체를 ISO 8601 표준 문자열로 반환하는 메서드입니다. 반환되는 형식은 다음과 같습니다.2018-11-23T11:14:38.000ZMySQL의 DATETIME 형식은 밀리초와 T, Z 문자를
MySQL 외래 키란 무엇인가?외래 키(Foreign Key)는 데이터베이스에서 테이블 간의 참조 무결성(referential integrity)을 유지하기 위해 사용되는 제약 조건(constraint)입니다. 두 테이블을 관계로 연결할 때, 외래 키를 설정한 테이블을 자식 테이블(child table), 참조 대상이 되는 테이블을 부모 테이블(parent table)이라고 부릅니다.부모 테이블에서는 외래 키로 지정된 컬럼이 기본 키(Primary Key) 역할을 하게 됩니다. 이번 글에서는 실제 예제를 통해 MySQL에서 외래 키
MySQL에서는 FROM_UNIXTIME() 함수를 사용하면 유닉스 타임스탬프(Unix Timestamp)를 손쉽게 날짜·시간 형식으로 변환할 수 있습니다. 이 글에서는 실제 예제를 통해 정수(int) 타입의 타임스탬프 값을 DATETIME으로 변환하고, 원하는 포맷으로 출력하는 방법까지 단계별로 살펴보겠습니다. 1. 테이블 생성하기 먼저 타임스탬프 값을 저장할 int 타입의 컬럼을 가진 테이블을 생성합니다. mysql> create table TimestamptoDateDemo -> ( -> Your
MySQL 테이블 이름의 최대 길이MySQL 8.0.12 버전을 기준으로, 테이블 이름(식별자)의 최대 길이는 64자입니다. 이 제한은 데이터베이스 이름, 컬럼 이름 등 다른 식별자에도 동일하게 적용됩니다.먼저 현재 설치된 MySQL 버전을 확인해 보겠습니다.mysql> select version();위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.+-----------+| version() |+-----------+| 8.0.12 |+-----------+1 row in set (0.03 sec)64자를 초과하는 테이
MySQL에서 테이블의 마지막 10개 행을 조회하려면 서브쿼리와 LIMIT 개념을 함께 사용하면 됩니다. 핵심 아이디어는 먼저 내부 쿼리에서 ORDER BY ... DESC와 LIMIT로 최신 데이터를 가져온 뒤, 외부 쿼리에서 다시 오름차순으로 정렬하는 것입니다.1. 예제 테이블 생성하기먼저 실습에 사용할 테이블을 생성합니다.mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Quer
MySQL에는 다양한 숫자 데이터 타입이 존재하며, 그중 BIT와 TINYINT는 저장 용량과 표현 가능한 값의 범위가 서로 다릅니다. 이 글에서는 두 데이터 타입의 차이점을 예제와 함께 자세히 살펴보겠습니다.BIT와 TINYINT의 기본 개념BIT는 1비트 크기의 값을 저장할 수 있는 데이터 타입입니다. 즉, 저장할 수 있는 값은 0 또는 1뿐입니다. 예를 들어 BIT 타입 컬럼에 2를 삽입하려고 하면 MySQL은 오류를 발생시킵니다.반면 TINYINT는 8비트(1바이트) 크기의 값을 저장할 수 있는 데이터 타입입니다. 부호가 있
MySQL BOOLEAN과 TINYINT(1), 실제 차이는 없을까?MySQL에서 BOOLEAN과 TINYINT(1)의 근본적인 차이는 사실 명명 방식(naming convention)에 있습니다. 참(true) 또는 거짓(false) 값을 다룰 때는 TINYINT(1)보다 BOOLEAN이라는 데이터 타입이 자연스럽게 떠오르기 때문입니다.흥미로운 점은 이 두 데이터 타입이 MySQL 내부적으로 동의어(synonym) 관계라는 것입니다. 즉, 어떤 타입을 사용할지는 전적으로 개발자의 선택에 달려 있으며, 값 역시 1과 0 또는 tru
MySQL에서 카디널리티(Cardinality)는 컬럼에 저장될 수 있는 데이터 값의 고유성(유일성)을 나타내는 개념입니다. 이 속성은 데이터를 검색하거나 클러스터링하고 정렬하는 성능에 직접적인 영향을 미치기 때문에, 데이터베이스 설계와 인덱스 최적화에서 매우 중요한 요소로 다뤄집니다.카디널리티는 크게 두 가지 유형으로 나눌 수 있습니다.낮은 카디널리티(Low Cardinality) — 컬럼의 모든 값이 동일하거나 중복이 허용되는 경우높은 카디널리티(High Cardinality) — 컬럼의 모든 값이 고유(Unique)해야 하는
MySQL에서 IP 주소를 저장하는 방법MySQL에서 IP 주소는 INT UNSIGNED 데이터 유형으로 효율적으로 저장할 수 있습니다. IP 주소는 점(dot)으로 구분된 문자열 형태이지만, 이를 32비트 정수 값으로 변환하여 저장하면 저장 공간을 절약하고 조회 성능도 높일 수 있습니다.이때 데이터를 삽입할 때는 INET_ATON() 함수를, 조회할 때는 INET_NTOA() 함수를 사용하면 됩니다. 각 함수의 역할은 다음과 같습니다.INET_ATON(): 점으로 구분된 IP 주소 문자열을 정수 값으로 변환합니다.INET_NTOA