web-dev-qa-db-fra.com

Est-il possible d'insérer des données non formatées pour le type de données d'argent dans PostgreSQL

Par défaut, le type de données money PostgreSQL insère les valeurs avec le code de devise et le regroupement. J'ai observé qu'il insère toujours des valeurs avec $.

  1. Comment puis-je insérer des valeurs spécifiques locales?
  2. Comment puis-je insérer des valeurs avec mon propre groupe de groupements de chiffres et de formats de regroupement décimal?
  3. Comment puis-je lire des données non formatées?
  4. Pourquoi le type de données d'argent de PostgreSQL est-il différent du type de données d'argent de MS SQL?
5
Ramesh Bathini
  1. Comment puis-je insérer des valeurs spécifiques locales?

Définir LC_MONETARY en conséquence. (Affecte uniquement le type money Type et certains détails monétaires dans la sortie de formatage!) Vous pouvez le faire par défaut permanent pour votre ensemble de cluster de DB dans postgresql.conf, juste pour la session en cours avec SET ou pour la transaction uniquement avec SET LOCAL . ( ou à plusieurs égards. )

Démo sur une machine Windows:

BEGIN;
CREATE TEMP TABLE mdemo(id serial, m money);

SET LOCAL lc_monetary = 'German_Austria.1252';
INSERT INTO mdemo(m) VALUES ('123.45');

SET LOCAL lc_monetary = 'English_US.1252';
INSERT INTO mdemo(m) VALUES ('123.45');
TABLE mdemo;

 id |     m
----+------------
  1 | $12,345.00
  2 |    $123.45


ROLLBACK;  -- to clean up

Comme vous pouvez le voir, le littéral de la chaîne '123.45' a été interprété en fonction du réglage actuel de LC_MONETARY. En Autriche, le point (.) sert de séparateur de groupe et , est le point décimal. Alors qu'aux États-Unis, c'est l'inverse.

Il est important de trouver des noms locaux corrects. le manuel :

Quels sont les locaux disponibles sur votre système sous quels noms dépend de ce qui a été fourni par le fournisseur du système d'exploitation et ce qui a été installé. Sur la plupart des systèmes UNIX, la commande locale -a fournira une liste de locaux disponibles. Windows utilise plus de noms locaux verbos, tels que German_Germany ou Swedish_Sweden.1252, mais les principes sont les mêmes.


  1. Comment puis-je insérer des valeurs avec mon propre groupe de groupements de chiffres et de formats de regroupement décimal?

Utilisez to_number() pour produire une valeur numeric de la chaîne littéral, qui peut à son tour être coulé sur money.

Dites, vous avez ce littéral: '12,454.8-': 2 chiffres, , en tant que séparateur de groupe, 3 chiffres, . comme point décimal, 1 chiffre, signe en attente. Cela ne fonctionne pas:

SELECT money '12,454.8-';

Travaux:

SELECT to_number('12,454.8-', '99,999.9S')::money

Puisque nous lisons dans un général nombre Le paramètre plus général pour - -LC_NUMERIC Applique pour l'importation pendant que le réglage de LC_MONETARY dicte toujours comment le Le résultat est affiché! Le casting de numeric à money est locale-agnostique (immutable). Ne soyez pas confus.

Et le motif du 2e paramètre est délicat également. Les symboles comme , et . sont pris littéralement et interprétés conformément aux paramètres régionaux (pas de paramètres régionaux), tandis que les motifs (vous pouvez utiliser '99G999D9S', aussi) sont interprétés selon les paramètres régionaux actuels.

J'ai suggéré des éclaircissements au manuel sur PGSQL-DOCS.


  1. Comment puis-je lire des données non formatées?

Vous pouvez lire Cela, mais vous pouvez difficilement lancer ceci à un type numérique sans minimiser d'informations sur son format.


Je préférerais toujours ne pas utiliser le type de données money. Spécification étroite et bizarre. Utilisez numeric pour couvrir toutes les bases. Ou juste integer _ signifiants cents, fonctionne mieux. Voir:

7
Erwin Brandstetter

Je recommanderais fortement à non Utilisez le type de données money.

Tous vos problèmes découlent des limites du type de données monétaire.

Utilisation numeric() est une bien meilleure alternative. Si vous devez stocker des valeurs pour Différent Devises C'est le choix seulement Choix Vous avez de toute façon (vous aurez besoin d'une autre colonne qui stocke la monnaie de cette valeur).


Pour répondre à tes questions:

Comment puis-je insérer des valeurs spécifiques à la locale ?

Vous ne pouvez pas. Le formatage (au moins dans PSQL) est toujours effectué en fonction de la localisation du client.

Comment puis-je insérer des valeurs avec mon propre groupe de groupes de chiffres et de formats de regroupement décimal ?

Vous ne pouvez pas. Les chiffres (y compris les numéros dans une colonne money) sont toujours stockés sans tout formatage. Le formatage est effectué en fonction des paramètres régionaux du client. Si vous avez besoin d'une utilisation numeric et d'appliquer la mise en forme de votre application ou US to_char()

Pourquoi l'argent de l'argent de PostgreSQL est différent avec MS-SQL Money DataType ?

Parce qu'il n'y a pas de norme pour un type de données "argent".

Comment puis-je lire des données non formatées ?

Je ne pense pas que cela soit facilement possible, car le formatage est effectué par la bibliothèque libpq. Il pourrait y avoir des appels d'API de faible niveau pour faire cela, mais certainement pas via SQL. Encore une fois en utilisant numeric est le meilleur choix si vous en avez besoin.

3