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: P>
Encoduri (URL) -> Renvoie l'URL codée P>
Par exemple:
Je cherche exactement la même chose. p> 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 p> -> 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. P> Merci! P> P> Encoduri ('http://hu.wikipedia.org/wiki/sÃkipedia.paulo') Code> -> Retourne une chaîne qui est
"http://hu.wikipedia.org/wiki/ S% C3% A3O_Paulo " Code> P>
"http% 3a% 2f% 2fhu.wikipedia.org% 2fwiki% 2fs% c3% a3o_paulo" < / Code> P>
8 Réponses :
lent et inefficace, envisagez de faire résultats: p> C code> de cette fonction:
# select urlencode('http://hu.wikipedia.org/wiki/São_Paulo');
-[ RECORD 1 ]------------------------------------------
urlencode | http://hu.wikipedia.org/wiki/S%C3%A3o_Paulo
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 ...: -)
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
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
avec PL / V8 ... Tricher?
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 ...
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;
@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'
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. exemple, p>
Moi aussi merci.
L'utilisation de :: Bytea dans les réponses de Tsohr et Nick est fausse. Faites une sélection '\' :: bytea pour voir pourquoi. P>
Dans les deux cas Convert_To (x, 'utf-8') donnera le résultat souhaité. p>
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 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;
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> 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;