MySQL có hỗ trợ gì cho các kiểu dữ liệu tùy chỉnh không? Ví dụ: mã zip có thể được lưu trữ trong một varchar(10)
trường, nhưng chúng có thể được nén vào một int
, với các tùy chọn để trống và một cờ cho dù đó là mã zip 5 chữ số hay 5 + 4 chữ số.
Có cách nào để cài đặt các loại dữ liệu liền mạch cho những thứ như vậy? Theo như ứng dụng, nó sẽ là một kiểu chuỗi, đơn giản là sẽ cắt bớt dữ liệu (có hoặc không có cảnh báo), nếu ứng dụng chuyển dữ liệu không hợp lệ.
Các chức năng tùy chỉnh có thể được sử dụng (ví dụ: có chức năng tích INET_ATON
hợp cho địa chỉ IPv4. Nhưng điều đó không cho phép những thứ zip LIKE '12345%'
cần được lập chỉ mục chính xác. Hỗ trợ bằng văn bản cho các loại dữ liệu tùy chỉnh sẽ cho phép loại dữ liệu được đánh dấu như sắp xếp. Vì vậy, nhỏ gọn zip int
, khi được sắp xếp, sẽ sắp xếp như thể nó là một zip varchar(10)
.
Điều này sẽ cho phép cột có chiều rộng cố định, nó sẽ cho phép lưu trữ biến 6 hoặc 10 byte được cắt xuống còn 4 bye chiều rộng cố định.
Có một số cách sử dụng
- Mã bưu điện
- Địa chỉ IPv6
- Các trường dấu thời gian tùy chỉnh với độ chính xác và dung lượng cấp phút vượt quá
2038
mức sử dụng lưu trữ ít hơndatetime
, nhưng không cần hỗ trợ ngày trước năm thực hiện (giả sử phút có thể là 2007 nếu đó là những ngày cũ nhất trong hệ thống) - Dấu thời gian thực hiện DST ( dường như không tồn tại )
- Hai chữ cái trạng thái Hoa Kỳ có thể được lưu trữ trong một byte đơn
ENUM
s dài có thể được tách thành một loại dữ liệu tùy chỉnh đểDESCRIBE
đầu ra của nó sẽ không quá lộn xộn với tất cả các gói.
Tôi hy vọng các trình xử lý kiểu dữ liệu sẽ được lưu trữ tương tự như cách các hàm được lưu trữ.
Có bất cứ điều gì từ xa như thế này trên bất kỳ công cụ cơ sở dữ liệu? Tôi chủ yếu sử dụng MySQL, nhưng tôi tò mò liệu điều này đã được thực hiện chưa, khiến ứng dụng gọi một chức năng giống như INET_ATON
chức năng.
MS SQL dường như có một cái gì đó thuộc về bản chất đó , nhưng tôi muốn biết nếu nó không chỉ là một từ đồng nghĩa. (ví dụ boolean
có thể là một từ đồng nghĩa với tinyint(1)
, hoặc postal_code
cho một trong char
hay varchar
(5
hay 9
hay 10)
) Từ đồng nghĩa không những gì tôi đang hỏi về tại đây.
IPv6
thành binary(16)
, hoặc là nó giới hạn ở răng cưa (mà có thể được sử dụng cho state
s trở enum
s)
int
sẽ không hoạt động đối với cơ sở dữ liệu được quốc tế hóa - ví dụ: Canada sử dụng định dạng 'A9A A9A'. Tạo một kiểu dữ liệu tùy chỉnh cho mã zip có lẽ là một ý tưởng tốt; tuy nhiên, bạn có thể muốn kiểm tra lại cách bạn dự định xử lý một số trong số họ (ví dụ, việc lưu trữ trạng thái trong trường một byte có các vấn đề 'khác' tiềm năng). Và không thực hiện lại các kiểu dữ liệu ngày / giờ, trừ khi các kiểu dữ liệu được cung cấp bị thiếu một cách có thể sử dụng được (kích thước không được tính) - bạn sẽ chỉ khiến mọi người nhầm lẫn.