2009-01-06 11 views
2

Je souhaite stocker des URL dans une base de données (MySQL dans ce cas) et les traiter en Python. Bien que la base de données et le langage de programmation ne soient probablement pas pertinents pour ma question.URL: Binaire Blob, Unicode ou Encodé Chaîne Unicode?

Dans ma configuration je reçois des chaînes unicode lors de l'interrogation d'un champ de texte dans la base de données. Mais une URL est-elle réellement un texte? L'encodage et le décodage en unicode sont-ils une opération qui devrait être effectuée sur une URL? Ou est-il préférable de faire de la colonne dans la base de données un blob binaire?

Alors, comment gérez-vous ce problème?

Clarification: Cette question ne concerne pas l'encodage de caractères non-ASCII avec la notation en pourcentage. Il s'agit de la distiction qu'unicode représente du texte et les chaînes d'octets représentent un moyen d'encoder ce texte en une séquence d'octets. En Python (avant 3.0) cette distinction est entre les types unicode et str. En MySQL c'est TEXT à BLOBS. Ainsi, les concepts semblent correspondre entre le langage de programmation et la base de données. Mais quelle est la meilleure façon de gérer les URL dans ce schéma?

Répondre

3

La réponse pertinente se trouve dans RFC 2396, section 2.1 URI et des caractères non-ASCII


La relation entre l'URI et les caractères a été une source de confusion pour les caractères qui ne font pas partie de l'US-ASCII. Pour décrire la relation , il est utile de distinguer entre un « caractère » (comme une entité sémantique distinguable) et un « octet » (un 8-bit octet). Il y a deux applications, l'une de caractères URI à octets, et un second d'octets de caractères d'origine:

caractère URI

sequence-> octet sequence-> séquence de caractères d'origine

Un URI est représenté comme une séquence de caractères, non en tant que séquence d'octets. C'est parce que URI peut être « transportée » par des moyens ne sont pas à travers un réseau informatique, par exemple, imprimé sur du papier, relisez la radio, etc.


+0

Je pense que cela fait un bon point pour avoir des URI en Unicode/TEXT, car cela représente mieux le texte lisible par l'homme et ne le convertit en séquences d'octets que lorsque cela est réellement nécessaire. –

+0

La RFC 2396 a été remplacée par la RFC 3986 il y a quatre ans. – bortzmeyer

+0

J'ai repéré celui-là aussi. Je ne pouvais pas trouver de meilleure formulation en 3986, cependant. – MSalters

1

Sur la question: "Mais est un URL text en fait?"

Cela dépend du contexte, dans certaines langues ou bibliothèques (par exemple java, je ne suis pas sûr de python), une URL peut être représentée en interne comme un objet. Cependant, une URL a toujours une représentation textuelle bien définie. Le stockage de la représentation textuelle est donc beaucoup plus portable que le stockage de la représentation interne utilisée par tout langage courant.

La syntaxe et la sémantique des URL sont couvertes par un certain nombre de normes, de recommandations et d'implémentations, mais je pense que la source la plus fiable pour analyser et construire les URL correctes serait RFC 2396.

Sur la question unicode, section 2.1 traite des caractères non-ascii.

(Edit: changé rfc référence à la dernière édition, je vous remercie S. Lott)

+0

Lorsque vous construisez un objet URL en Java, lui transmettez-vous une chaîne? Mon Java est un peu rouillé mais je pense que vous n'avez pas beaucoup d'options là-bas? –

+0

Mises à jour RFC 2396: 1808, 1738. Cette information est basée sur l'ancienne définition de l'URI. Pas la définition actuelle. –

1

Ne noter qu'il ya aussi une norme pour Unicode Adresses Web, IRI (Internationalized Resource Identifiers).RFC 3987