Colonnes avec le type binary

Bonjour à tous,

J’aimerais avoir un champ uuid dans une de mes tables MySQL.

uuid est généré à partir de du gem uuidtools

J’ai vu qu’on pouvait stocker un uuid (qui a la forme
“b636f44864a511de860100254ba858de”) en BINARY(16) au lieu des CHAR(32)
qui prennent beaucoup plus de place dans le stockage.

Pour cela, on convertit l’UUID (considéré comme du Hexadecimal) en
binaire et on le stocke dans BINARY(16).

Malheuresement, je ne comprends pas très bien comment le Binary est
géré par Mysql et Rails.

Lorsque je fais,

insert into entities (id) VALUES
(‘0011001011110100001000101100010110011011001100010001110000000000000000000000000000000000000000000000000000000000000000000000’)

avec id qui est un champ BINARY(16), puis je sélectionne :

±---------±-----------------±--------------------±-----+
| added_id | id
±---------±-----------------±--------------------±-----+
| 4 | 0011001011110100
±---------±-----------------±--------------------±-----+

Le binaire est coupé à 16 charactères, alors que BINARY(16) permet de
stocker 16 * 8 bites.

Merci beaucoup pour votre aide, car je suis complétement bloqué là et
je ne trouve rien sur Internet,

Cordialement,

Pierre V.

Des bites ou des bits ?

Parce que 16 bits = 2 octets ça fait 16 * (1 ou 0), donc
0011001011110100 ça
entre… Mais pas
0011001011110100001000101100010110011011001100010001110000000000000000000000000000000000000000000000000000000000000000000000.

Alors que 16 bytes (avec un “y”) soit 16*8 bits ça permet de faire
rentrer
0011001011110100001000101100010110011011001100010001110000000000000000000000000000000000000000000000000000000000000000000000
en entier.

Michel B.

The allowable maximum length is the same for BINARY and VARBINARY as
it is for CHAR and VARCHAR, except that the length for BINARY and
VARBINARY is a length in bytes rather than in characters.

Donc c’est des bytes… normalement ça devrait passer…
Mais d’ailleurs, je comprends pas pourquoi j’ai le droit de faire

insert into entities (id) values (‘string’)

alors que la column est binary…

On 7 juil, 16:03, Michel B. [email protected]

Essaye d’écrire autre chose que des “0” et des “1” pour voir ?.. (des
fois
que, je ne sais pas, tu aies écrit un octet par byte dans ton champs de
16
bytes…)

Michel B.

2009/7/7 Pierre V. [email protected]

Je voulais dire “que tu aies écrit un bit par byte”.
Michel B.

2009/7/7 Michel B. [email protected]

Le binaire est coupé à 16 charactères, alors que BINARY(16) permet de
stocker 16 * 8 bites.

désolé, mais ça me fait trop penser à “et ta mère, quand elle a 16 bites
dans le cul, elle se prend pour une Mégadrive ?”.

:smiley:

gUI


Pour la santé de votre ordinateur, préférez les logiciels libres.
Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/
Browser le web : http://www.mozilla-europe.org/fr/products/firefox/
Suite bureautique : http://fr.openoffice.org/

c’est à dire ?

On 7 juil, 17:45, Michel B. [email protected]

Et tu la sens là ma grosse finesse ?

Michel B.

2009/7/7 Guillaume B. [email protected]

2009/7/7 Pierre V. [email protected]:

alors que la column est binary…

Tu n’as pas du bien comprendre le principe du binary. Les types
char/varchar stockent des chaines non binaires alors que les binary le
permettent. Ca ne veut pas dire que tu stocke de l’hexa. Tu as toute
la table ascii si tu le désire.

La page que tu cite
(http://dev.mysql.com/doc/refman/5.0/en/binary-varbinary.html) donne
un exemple concret où est stocké une valeur ‘a’ dans une colonne de
type binary(3). Cet valeur est ensuite affichée en hexa par
l’opérateur HEX et affiche bien le code ascii de la lettre ‘a’ en hexa
: 61.

Le comportement que tu reproches est donc parfaitement normal : tu
essaie de stocker 16 charactères (d’un octet chacun) et il en stocke
effectivement 16. Si tu veux stocker ta chaine de 16 octets se
trouvant sous forme binaire, tu devras la convertir.


http://fabien.jakimowicz.com

Merci beaucoup Fabien. Les idées sont claires maintenant.

2009/7/7 Fabien J. [email protected]:

un exemple concret où est stocké une valeur ‘a’ dans une colonne de
type binary(3). Cet valeur est ensuite affichée en hexa par
l’opérateur HEX et affiche bien le code ascii de la lettre ‘a’ en hexa
: 61.

Le comportement que tu reproches est donc parfaitement normal : tu
essaie de stocker 16 charactères (d’un octet chacun) et il en stocke
effectivement 16. Si tu veux stocker ta chaine de 16 octets se
trouvant sous forme binaire, tu devras la convertir.

Et evidemment, j’oubliais :
INSERT INTO entities(id) VALUES
UNHEX(“b636f44864a511de860100254ba858de”);

je n’ai pas testé, mais il n’y a aucune raison que cela ne marche pas.


http://fabien.jakimowicz.com