7
votes

Encodéturi JavaScript comme fonction de postgreSQL?

existe-t-il une procédure de fonction / stockée dans PostgreSQL / PLPGSQL qui est identique à celle des javascripts Encoduri?

Qu'est-ce que cela signifie? JavaScript a une fonction intégrée pratique pour coder tout type d'URL:

Encoduri (URL) -> Renvoie l'URL codée

Par exemple: Encoduri ('http://hu.wikipedia.org/wiki/sÃkipedia.paulo') -> Retourne une chaîne qui est "http://hu.wikipedia.org/wiki/ S% C3% A3O_Paulo "

Je cherche exactement la même chose.

Je ne veux pas encoder chaque paramètre séparément. Je ne veux pas de fonction comme JavaScript Encodericomponant qui n'est pas la même chose. L'exemple ci-dessus résulte une sortie différente avec xxx

-> "http% 3a% 2f% 2fhu.wikipedia.org% 2fwiki% 2fs% c3% a3o_paulo" < / Code>

Il est coder la chaîne entière non seulement la partie de chemin. Donc ce n'est pas ce que je cherche. J'ai besoin d'une fonction PLPGSQL qui donne une sortie équivalente à la fonction JavaScript Encodœuri.

Merci!


0 commentaires

8 Réponses :


15
votes

lent et inefficace, envisagez de faire C code> de cette fonction: xxx pré>

résultats: p>

# select urlencode('http://hu.wikipedia.org/wiki/São_Paulo');
-[ RECORD 1 ]------------------------------------------
urlencode | http://hu.wikipedia.org/wiki/S%C3%A3o_Paulo


1 commentaires

Oh merci! Je recherche une fonction intégrée ou une bibliothèque Postgres à installer, qui contient ce type de fonction. Je suis optimiste, je pense que quelqu'un l'a fait devant nous, car c'est un problème simple / quotidien ... J'ai aussi fait la même procédure stockée, mais comme vous l'avez écrit aussi, c'est inefficace et lent. Et oui, comme vous avez mentionné la version native c Native C est le seul moyen de le faire crier ... Donc, ma question est de savoir quoi installer, que d'utiliser, quelle est la meilleure bibliothèque pour cela, pas écrire un type de code ...: -)



6
votes

J'ai écrit PostgreSQL Extensions URL_ENCODE qui résout ce problème.

postgres=# select uri_encode('http://hu.wikipedia.org/wiki/São_Paulo');
               uri_encode                  
---------------------------------------------
http://hu.wikipedia.org/wiki/S%C3%A3o_Paulo


5 commentaires

Peut-être que je le modifierai un peu ... il a un bogue, après le protocole (http) ... Si vous ajoutez c == ':' sur la 95ème ligne, cela fonctionnera parfaitement ... (et la ligne 154 aussi. .. être cohérent)


Ceci est seulement la version initiale - je vais ajouter une fonction uri_encode et uri_decode, vous ne pouvez pas modifier comme vous proposer, car: les caractères sont réservés.


J'ai téléchargé la nouvelle version prenant en charge les mêmes fonctions javascript.


Il existe une extension Postgres plus récente pour ajouter le type de données URI à Postgres. Ce pourrait être un bon choix: Github.com/petere/pguri


@Enwired assez étrangement, le paquet PGURI est plus récent et a plus de fonctions mais ne parvient pas à encoder URI avec des accents. Voir Github.com/petere/pguri/issues/8



6
votes

avec PL / V8 ... Tricher? XXX


1 commentaires

Et ici l'expression "en utilisant un bazooka pour tuer une mouche" prend tout son sens. Considérons 3 ~ 5 Go d'espace disque et beaucoup, beaucoup de CPU pour compiler cette PLV8 ...



1
votes

Voici "Pure SQL" (pas de PLV8, PLPYTHON ou même PLPGSQL n'est nécessaire) Mise en œuvre Soutenir des caractères multi-octets (dont 3 et 4 octets Emoji):

create or replace function urlencode(text) returns text as $$
  select
    string_agg(
      case
        when ol>1 or ch !~ '[0-9a-zA-Z:/@._?#-]+' 
          then regexp_replace(upper(substring(ch::bytea::text, 3)), '(..)', E'%\\1', 'g')
        else ch
      end,
      ''
    )
  from (
    select ch, octet_length(ch) as ol
    from regexp_split_to_table($1, '') as ch
  ) as s;
$$ language sql immutable strict;


2 commentaires

@DMitry tous les détails? Message d'erreur? Quelle version postgres utilisez-vous?


Sélectionnez UrlenCode ('12 3 ') renvoie' 123 'mais prévu '12% 203'



5
votes

Aujourd'hui, j'ai rencontré "ne traitera pas de 3 (ou plus) séquences d'octets". Pour les personnages coréens pendant que j'utilise la réponse de @vyegorov depuis longtemps, plus d'un an, il faut changer de temps que cela vient de jeter les chaînes hexagonales bytea avec "%" préfixées. xxx

exemple, xxx


1 commentaires

Moi aussi merci.



2
votes

L'utilisation de :: Bytea dans les réponses de Tsohr et Nick est fausse. Faites une sélection '\' :: bytea pour voir pourquoi.

Dans les deux cas Convert_To (x, 'utf-8') donnera le résultat souhaité.


0 commentaires

2
votes

C'est un très vieux fil, mais surprenant, aucune des solutions précédemment affichées ne semble être conforme à la pertinence RFC 3986 . Voici donc deux fonctions PostgreSQL ENCODE_URI strud> (si vous souhaitez encoder une URI complète) et encod_uri_component strong> (si vous souhaitez encoder juste un composant de l'URI, par exemple la clé ou Valeur d'un paramètre de requête) qui combine Nick's Buggy Solution , Note d'Eldiabolo et La solution partielle de KEV à partir d'un thread associé dans un seul SQL de travail -Enly solution.

Comment ça marche: d'abord, explosez la chaîne en caractères uniques, puis codez hexagonal à chaque caractère multibyte et et chaque caractère interdit. P>

Code Uri Composant: Fort > P>

create or replace function encode_uri(text) returns text as $$
    select string_agg(
        case
            when bytes > 1 or c !~ '[0-9a-zA-Z_.!~*''();,/?:@&=+$#-]+' then 
                regexp_replace(encode(convert_to(c, 'utf-8')::bytea, 'hex'), '(..)', E'%\\1', 'g')
            else 
                c
        end,
        ''
    )
    from (
        select c, octet_length(c) bytes
        from regexp_split_to_table($1, '') c
    ) q;
$$ language sql immutable strict;


0 commentaires

2
votes

PLPYTHON3 offre une approche simple.

Installez PLPYTHON3 si vous ne l'avez pas déjà. Exemple d'installation de package pour la ligne de commande: p> xxx pré>

créer la langue (si vous ne l'avez pas déjà fait pour d'autres fonctions): P>

CREATE OR REPLACE FUNCTION encode_uri(input_string text)
  RETURNS text
AS $$
  import urllib.parse
  return urllib.parse.quote_plus(input_string, safe='~@#$&()*!+=:;,.?/\\''')
$$ LANGUAGE plpython3u immutable strict;


0 commentaires