Có những thứ như kiểu dữ liệu tùy chỉnh?


14

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_ATONhợ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á 2038mức sử dụng lưu trữ ít hơn datetime, 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
  • ENUMs 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_ATONchứ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ụ booleancó thể là một từ đồng nghĩa với tinyint(1), hoặc postal_codecho một trong charhay varchar (5hay 9hay 10)) Từ đồng nghĩa không những gì tôi đang hỏi về tại đây.


câu trả lời đơn giản afaik cho mysql: không. Điều này sẽ rất thú vị để xem các RDBMS khác xử lý những việc đó như thế nào
Derek Downey

@DTest: bạn có CREATE TYPE trong SQL Server: hữu ích cho các loại CLR ngay bây giờ. msdn.microsoft.com/en-us/l Library / ms175007 (MySQL.90) .aspx
gbn

1
@George Bailey: liên kết SQL Server của bạn đã hết hạn: đó là SQL Server 2000. Và đối với MySQL, hãy xem stackoverflow.com/q/2451435/27535
gbn

@gbn, (Đáp lại bình luận đầu tiên) là loại dịch bao gồm, nó sẽ chuyển đổi ví dụ một IPv6thành binary(16), hoặc là nó giới hạn ở răng cưa (mà có thể được sử dụng cho states trở enums)
Bryan Dòng

1
Xin lưu ý rằng việc lưu trữ mã zip dưới dạng intsẽ 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.
Clockwork-Muse

Câu trả lời:


14

MySQL có hỗ trợ gì cho các kiểu dữ liệu tùy chỉnh không?

Câu trả lời đơn giản: không

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 hàm như hàm INET_ATON.

Oracle có CREATE TYPEtương tự ở một mức độ nào đó với lớp OO, bao gồm các tính năng như chức năng thành viên và kế thừa

Postgres có CREATE TYPEít hơn một chút so với các lớp OO (không có chức năng thành viên hoặc kế thừa) nhưng cực kỳ linh hoạt và hữu ích, thậm chí cho phép bạn tạo các loại cơ sở mới. Ngoài ra còn CREATE DOMAINcó cho phép một hình thức thừa kế hoặc gõ phụ và về cơ bản mở rộng một loại cơ sở với một số ràng buộc. Postgres cũng có khá nhiều loại cơ sở thú vị theo mặc định, ví dụ như các loại hình inethình học . Trong Postgres, người ta có thể viết một phần mở rộng bằng C cho một kiểu dữ liệu tùy chỉnh, chẳng hạn như trong ví dụ này ở đây với kiểu dữ liệu base36 .

SQL Server có CREATE TYPEcho phép bạn tạo một kiểu dữ liệu tùy chỉnh dựa trên kiểu dữ liệu hệ thống hiện có. Ví dụ: tôi có thể tạo một loại được gọi SSNlà cơ bản được định nghĩa là VARCHAR(11)nhưng theo cách này tôi không phải nhớ nó lớn như thế nào.


1
Xin vui lòng chồng chất và chỉnh sửa câu trả lời này để chúng tôi có thể có được một tài liệu tham khảo dứt khoát. Tôi cảm thấy câu hỏi được đưa ra cho câu trả lời của CW ...
Jack nói hãy thử topanswers.xyz

0

Firebird cũng có giải pháp thông qua các tên miền .

Trong Firebird, khái niệm về kiểu dữ liệu do người dùng định nghĩa là người dùng được thực hiện dưới dạng tên miền. Tất nhiên, việc tạo một miền không thực sự tạo ra một kiểu dữ liệu mới. Một miền cung cấp các phương tiện để đóng gói một kiểu dữ liệu hiện có với một tập hợp các thuộc tính và làm cho viên nang này có sẵn cho nhiều mục đích sử dụng trên toàn bộ cơ sở dữ liệu. Nếu một số bảng cần các cột được xác định bằng các thuộc tính giống hệt hoặc gần giống nhau, thì một miền có ý nghĩa.

Việc sử dụng tên miền không giới hạn đối với các định nghĩa cột cho bảng và dạng xem. Tên miền có thể được sử dụng để khai báo các tham số và biến đầu vào và đầu ra trong mã PSQL.


Là Firebird MySQL?
Anthony Genovese

Không, Firebird là Firebird :) Tôi vừa đề cập là RDMS có tính năng như vậy.
Tibor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.