최신 버전에서 CREATE TABLE 쿼리에 자동으로 접두사가 붙게 된 것 같습니다.
제 모듈들은 CREATE TABLE 쿼리에 직접 접두사를 붙여왔기 때문에 최신 RX 모듈 설치에 문제가 발생하고 있습니다.
오류 수정을 위해 빠른 시간내에 모듈들의 업데이트를 배포하겠습니다.
오류 예상 모듈: https://rhymix.org/pds/category/584?member_srl=1900020
감사합니다.
엘카
Lv. 4
댓글 4
빠른 조치 감사드립니다
빠른 업데이트 감사합니다.
나름 최근 방식으로 만드신 모듈인 것 같은데, XML 스키마를 사용하지 못할 이유가 있었나요?
상황에 따라 이름을 바꿔가며 불특정 다수의 테이블을 생성한다거나...
옛날에는 XML 스키마로 테이블 생성하다가 데이터 조작에 한계가 있어서 언제부턴지 선호하지 않는 습관이 들었네요.
잘 선호하지 않는 이유만 적어보겠습니다.
1
CREATE TABLE `rx_elkhatalk_public_grants` (
`pk` bigint unsigned NOT NULL AUTO_INCREMENT,
`room` tinyint unsigned NOT NULL,
`member_srl` bigint unsigned NOT NULL,
`expdate` timestamp NULL DEFAULT NULL,
`regdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`grants_int` tinyint unsigned NOT NULL DEFAULT '0',
UNIQUE KEY `pk` (`pk`),
UNIQUE KEY `room` (`room`,`member_srl`),
KEY `room_grants_int` (`room`,`grants_int`),
KEY `member_srl_grants_int` (`member_srl`,`grants_int`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
2
타자치는 김에 하나 더 보태면 type="date" 일 때 컬럼 타입이 문자라서 order 성능이 크게 감소됩니다.
10년도 더 전에 그게 문제된 적이 있었는데 코어 최신 동향은 어떨지 잘 모르겠습니다. bigint 바꿔버리는 자작 스크립트 쓰거든요.
<column name="regdate" type="date" />
date 타입에 숫자 놔두고 왜 문자열 선언했나 개인적으로 추리해보면 xe 나올 당시 x86 계열 서버의 bigint 길이의 한계로 그렇지 않았나 싶습니다.
저는 DATETIME 또는 TIMESTAMP 선호합니다.
3
tinyint, smallint, int 등의 선언도 bigint 퉁쳐버리는 xml 스키마 한계가 있었지만 요새는 어떤지 모르겠습니다.
어떨때는 binary, varbinary, json 컬럼 선언도 필요했습니다. ipv4|ipv6 선언시 VARBINARY(16) 형태로 저장하는게 가장 효율적으로 알고 있습니다.
enum, unsigned 등의 선언도 잘 안 되었던 기억이.. ㅠㅠ
1. default="current_timestamp()" 아마 작동할 겁니다. on update 속성은 현재 FK constraint를 선언할 때만 인식하는 것 같은데, 이슈 등록해 주시면 컬럼 선언에서도 지원하겠습니다.
2. datetime 또는 timestamp 타입을 사용하시면 됩니다. 코어 차원에서도 Y-m-d H:i:s 형태로 저장된 데이터를 zdate() 같은 레거시 함수에 넣어도 정확하게 해석하는 등, 은근히 전환을 권장하고 있으니 기존의 문자열 타입은 잊어버리셔도 됩니다. (시간 빼고 날짜만 저장하고 싶다면 type="date"는 XE식 타입명으로 해석하니, 백슬래시를 붙여 type="\date"라고 쓰시면 DB 고유의 date 타입으로 맵핑합니다. SQL 표준 타입명을 라이믹스에서 쓸 수 없는 유일한 사례입니다.)
XE에서 이상하게 처리한 DB 타입은 대부분 초창기의 큐브리드 탓이라고 보시면 됩니다. 나름 국산 RDBMS라고 XE 개발팀이 한때 큐브리드를 팍팍 밀어주었는데, 그 때문에 많은 기능들이 하향평준화되어 버렸습니다. 라이믹스는 큐브리드를 지원하지 않으므로 (그리고 만약 다시 지원한다 해도, 예전보다 많이 발전했으므로) 해당 제한이 없지만, 하위 호환성을 위해 기존의 타입 명칭은 기존 방식으로 맵핑하고 있으니 적당히 피하는 수밖에요.
3. tinyint, timestamp, json, uuid, varbinary, polygon 등 과거 XE에서 사용하지 않던 타입이라도, DB가 지원한다면 XML에서 그대로 쓰시면 됩니다. number처럼 XE에서 만들어낸 이상한 타입명은 아예 안 쓰는 것이 차라리 편하죠.
단, IP 주소를 varbinary로 저장하는 등 과도한 최적화는 권장하지 않습니다. 다른 사람이 읽고 공부하고 디버깅하고 고쳐쓰기 편리한 상태를 유지한다는 대원칙 때문입니다. 그게 성능에 큰 영향을 미칠 정도라면, 다른 부분에서 쿼리 최적화가 필요한 것은 아닐지 생각해 보아야겠지요.^^
enum의 경우, 특수문자를 포함하여 복잡하게 선언하면 잘못 해석될 수도 있을 것 같은데, 한 번 써보시고 만약 문제가 있다면 말씀해 주세요.
말씀하신 것들 중 라이믹스에서 지원 계획이 전무한 것은 unsigned뿐입니다. 추후 여건이 된다면 MySQL/MariaDB 외의 유명 오픈소스 DB도 지원해 볼 생각이 있는데, (PostgreSQL이라든지... PosgreSQL이라든지... ㅋㅋㅋ) 대부분의 다른 DB들은 unsigned를 지원하지 않기 때문입니다.