Spanner תומך בסוג הנתונים NUMERIC גם במסדי נתונים של GoogleSQL וגם במסדי נתונים של PostgreSQL.
GoogleSQL NUMERIC
הפונקציה NUMERIC ב-GoogleSQL היא סוג נתונים מספרי מדויק שיכול לייצג ערך מספרי מדויק עם דיוק של 38 וקנה מידה של 9. בדף הזה מובאת סקירה כללית על האופן שבו NUMERIC
מיוצג בספריות לקוח.
PostgreSQL NUMERIC
הסוג 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.
אי אפשר להשתמש בעמודות של PostgreSQL NUMERIC כשמציינים מפתחות ראשיים, מפתחות זרים או אינדקסים משניים.
ייצוג של NUMERIC בכל שפה של ספריית לקוח
כדי לשמור על הדיוק של ערכי NUMERIC, כל ספריית לקוח של Spanner מאחסנת את הערכים האלה בסוג נתונים מתאים בשפה של ספריית הלקוח. בטבלה הבאה מפורטים סוגי הנתונים שאליהם ממופה NUMERIC בכל שפה נתמכת.
| שפה | GoogleSQL | PostgreSQL |
|---|---|---|
| C++ | spanner::Numeric | |
| C# | SpannerNumeric | |
| Go | big.Rat | Custom PGNumeric |
| Java | BigDecimal | סוג מותאם אישית. הערות לגבי ספריות Java של PostgreSQL |
| Node.js | Big | |
| PHP | מספרי מותאם אישית | |
| Python | עשרוני | עשרוני עם הערה בהתאמה אישית |
| Ruby | BigDecimal |
בכל אחת משלוש ספריות הלקוח, 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.pgNumericStatement .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
בדוגמה הבאה מוצג איך לעדכן נתוני 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 באמצעות הסוג Java
BigDecimal. דוגמאות לשימוש ב-NUMERIC מופיעות בדוגמאות הקוד במאמר חיבור JDBC למסד נתונים של ניב GoogleSQL.
טיפול ב-NUMERIC כשיוצרים ספריית לקוח או דרייבר
הסוג NUMERIC מקודד כמחרוזת בסימון עשרוני או מדעי בתוך פרוטו google.protobuf.Value. פרוטו זה עטוף כ-ResultSet, PartialResultSet או Mutation, בהתאם לכך אם הוא נקרא או נכתב. הפונקציה ResultSetMetadata תשתמש ב-NUMERIC
TypeCode כדי לציין שצריך לקרוא את הערך המתאים כ-NUMERIC.
כשעובדים עם NUMERIC בספריית לקוח או בדרייבר שיוצרים, חשוב לפעול לפי ההנחיות הבאות.
כדי לקרוא
NUMERICמ-ResultSet:קוראים את הערך string_value מ-proto google.protobuf.Value כש-TypeCode הוא
NUMERICלהמיר את המחרוזת לסוג הרלוונטי בשפה הנתונה
כדי לכתוב
NUMERICבאמצעות מוטציות, צריך להשתמש בייצוג המחרוזת בתור string_value בפרוטו google.protobuf.Value כשמציינים את הסוג הרלוונטי.