ב-Spanner יש תמיכה בסוג הנתונים NUMERIC גם במסדי נתונים של GoogleSQL וגם במסדי נתונים של PostgreSQL.
GoogleSQL NUMERIC
הפונקציה NUMERIC של GoogleSQL היא סוג נתונים מספרי מדויק שיכול לייצג ערך מספרי מדויק עם דיוק של 38 וקנה מידה של 9. בדף הזה מוסבר איך NUMERIC מיוצג בספריות הלקוח.
NUMERIC ב-PostgreSQL
הסוג NUMERIC של PostgreSQL הוא סוג נתונים מספרי עם דיוק עשרוני שרירותי, עם דיוק מקסימלי (סה"כ ספרות) של 147,455 וקנה מידה מקסימלי (ספרות מימין לנקודה העשרונית) של 16,383.
Spanner DDL לא תומך בציון דיוק וקנה מידה לעמודות NUMERIC של PostgreSQL. עם זאת, אפשר להמיר ערכים מספריים לערכים עם דיוק קבוע בהצהרות DML. לדוגמה:
update t1 set numeric_column = (numeric_column*0.8)::numeric(5,2);
הסוג DECIMAL הוא שם חלופי ל-NUMERIC.
אי אפשר להשתמש בעמודות NUMERIC של PostgreSQL כשמציינים מפתחות ראשיים, מפתחות זרים או אינדקסים משניים.
ייצוג של NUMERIC בכל שפה של ספריית לקוח
כדי לשמור על הדיוק של ערכי NUMERIC, כל ספריית לקוח של Spanner מאחסנת את הערכים האלה בסוג נתונים מתאים בשפת ספריית הלקוח. בטבלה הבאה מפורטים סוגי הנתונים שאליהם ממופה NUMERIC בכל אחת מהשפות הנתמכות.
| שפה | GoogleSQL | PostgreSQL |
|---|---|---|
| C++ | spanner::Numeric | |
| C# | SpannerNumeric | |
| המשך | big.Rat | Custom PGNumeric |
| Java | BigDecimal | סוג מותאם אישית. הערות לגבי ספריית Java של PostgreSQL |
| Node.js | Big | |
| PHP | מספרי בהתאמה אישית | |
| Python | עשרוני | עשרוני עם הערה מותאמת אישית |
| Ruby | BigDecimal | |
| Rust | עשרוני |
בשלוש ספריות לקוח, C++, C# ו-PHP, הוטמע סוג מותאם אישית שמייצג את הסוג NUMERIC של Spanner SQL. כל שאר הספריות משתמשות בסוג קיים.
האובייקט spanner::Numeric של ספריית הלקוח C++ לא תומך בפעולות אריתמטיות. במקום זאת, צריך להמיר את המספר הכלול לאובייקט C++ הרצוי.
לדוגמה, אפשר לחלץ את המספר כמחרוזת, שתייצג את המספר בנאמנות מלאה וללא אובדן נתונים. אבל אם אתם יודעים מראש שהמספר מתאים, למשל, לטווח של std:int64_t או double, אתם יכולים לגשת לערך כסוג הזה.
הערות לגבי ספריית Java של PostgreSQL
ספריית הלקוח של Spanner ב-Java משתמשת בסוג Value.pgNumeric בהתאמה אישית כדי לאחסן ערכי NUMERIC של PostgreSQL.
כתיבה בעמודה מסוג NUMERIC
כשכותבים לעמודה מסוג NUMERIC בטבלה של PostgreSQL, יש תמיכה בכמה סוגים.
תורת המספרים
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1.23)מספרים שלמים
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1)זוגות
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1.23::float8)ליטרלים ללא סוג
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 'NaN')
שאילתות שמכילות פרמטרים
כשמשתמשים בשאילתות שמכילות פרמטרים, מציינים את הפרמטרים באמצעות $<index>, כאשר <index> מציין את מיקום הפרמטר. לאחר מכן צריך לקשר את הפרמטר באמצעות p<index>. לדוגמה,
INSERT INTO MyTable (PgNumericColumn) VALUES ($1) עם הפרמטר
p1.
ספריית הלקוח של Java תומכת בסוגים הבאים כערכי פרמטר:
Value.pgNumericבהתאמה אישיתStatement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1), ($2)") .bind("p1") .to(Value.pgNumeric("1.23")) .bind("p2") .to(Value.pgNumeric("NaN")) .build()זוגות
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1), ($2)") .bind("p1") .to(1.23D) .bind("p2") .to(Double.NaN) .build()מספרים שלמים
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1)") .bind("p1") .to(1) .build()ארוכים
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1)") .bind("p1") .to(1L) .build()
מוטציות
כשמשתמשים במוטציות, אפשר לכתוב את הערכים הבאים בעמודות מסוג מספרי:
מחרוזות
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to("1.23") .build()ערכים מסוג BigDecimal
BigDecimals
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(new BigDecimal("1.23")) .build()Ints
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(1) .build()ארוכים
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(1L) .build()ערכים שמתקבלים כתוצאה מקריאה ל-Value.pgNumeric
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(Value.pgNumeric("1.23")) .build()
אחזור מעמודה מספרית (NUMERIC)
כדי לקבל ערכים שמאוחסנים בעמודות מספריות של ResultSet,
צריך להשתמש ב-ResultSet.getString() או ב-ResultSet.getValue().
מחרוזות
resultSet.getString("PgNumericColumn")ערך מותאם אישית
Value pgNumeric = resultSet.getValue("PgNumericColumn"); pgNumeric.getString(); // get underlying value as a String pgNumeric.getNumeric(); // get underlying value as a BigDecimal pgNumeric.getFloat64(); // get underlying value as aDouble
הוספת עמודה מסוג NUMERIC
בדוגמה הבאה מוסבר איך להוסיף עמודה מסוג NUMERIC לטבלה בשם Venues באמצעות ספריות הלקוח של Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
עדכון נתונים מספריים
בדוגמה הבאה מוסבר איך לעדכן נתוני NUMERIC באמצעות ספריות הלקוח של Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
שליחת שאילתה על נתונים מספריים (NUMERIC)
בדוגמה הבאה מוסבר איך לשלוח שאילתה לנתוני NUMERIC באמצעות ספריות הלקוח של Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
NUMERIC נתמך במנהל ההתקן של Spanner JDBC באמצעות הסוג BigDecimal של Java. דוגמאות לשימוש ב-NUMERIC מופיעות ב<b>דוגמאות קוד</b> במאמר קישור JDBC למסד נתונים בניב GoogleSQL.
טיפול ב-NUMERIC כשיוצרים ספריית לקוח או דרייבר
הסוג NUMERIC מקודד כמחרוזת בייצוג עשרוני או מדעי בתוך פרוטו google.protobuf.Value. הפרוטוקול הזה מוגדר כ-ResultSet, כ-PartialResultSet או כ-Mutation, בהתאם לפעולה שמבצעים – קריאה או כתיבה. ResultSetMetadata ישתמש ב-NUMERIC TypeCode כדי לציין שצריך לקרוא את הערך המתאים בתור NUMERIC.
כשעובדים עם NUMERIC בספריית לקוח או בדרייבר שיוצרים, צריך לפעול לפי ההנחיות הבאות.
כדי לקרוא
NUMERICמ-ResultSet:קוראים את string_value מהפרוטוקול google.protobuf.Value כש-TypeCode הוא
NUMERICממירים את המחרוזת הזו לסוג הרלוונטי לשפה הנתונה
כדי לכתוב
NUMERICבאמצעות מוטציות, משתמשים בייצוג המחרוזת בתור string_value ב-proto של google.protobuf.Value כשמקבלים את הסוג הרלוונטי.