私はpython3とpandasを使っていくつかのSQLデータベースに接続しています:
import pandas as pd
import mysql.connector
cnx = mysql.connector.connect(user='me', password='***',
host='***',
database='***')
df=pd.read_sql("select id as uid,refType from user where registrationTime>=1451606400",con=cnx)
cnx.close()
id と refType の 2 つの列を取得しています。どちらも文字列型 (SQL 用語では varchar) です。しかし、なぜか、refType 列は文字列として正しくインポートされますが、uid 列は bytearray としてインポートされます。これは彼らがどのように見えるかです:
df.head()
uid
0 [49, 54, 54, 57, 55, 54, 50, 55, 64, 97, 110]
1 [49, 54, 54, 57, 55, 54, 50, 56, 64, 105, 111]
2 [ 49, 48, 49, 53, 51, 50, 51, 50, 57, 53, 57, 5...
3 [57, 53, 52, 52, 56, 57, 56, 56, 49, 50, 57, 5...
4 [49, 54, 54, 57, 55, 54, 50, 57, 64, 105, 111]refType
0 adx_Facebook.IE_an_ph_u8_-.cc-ch.gf.au-ret7.c...
1 adx_Facebook.IE_io_ph_u4_-.cc-gb.gf.au-toppay...
2 ad_nan_1845589538__CAbroadEOScys_-.cc-ca.gf.a. ..
3 ad_offerTrialPay-DKlvl10-1009
4 adx_Facebook.IE_io_ph_u4_-.cc-us.gf.au-topspe...
そして、これは uid 列がどのように見えるかです:
[i.decode() for i in df['uid'][1:5]]
['16697628@io', '10153232959751867@fb', '954489881295911@fb', '16697629@io']
なぜバイト配列に変換されたのか、文字列に変換する方法もわかりません。インターネットやパンダのドキュメントで、それに関する質問や同様の質問を見つけることができませんでした。もちろん、インポート後にいつでもその列を文字列に変換できますが、それは好まれません。なぜなら、示されているSQLクエリは単なる例であり、実際のテーブルには何百もの列がバイト配列として誤ってインポートされる可能性があるからです。それらの列を手動で見つけて文字列に変換するのは本当に面倒です
コネクタ自体は同じバイト配列を出力します。
cursor = cnx.cursor()
cursor.execute('select id as uid,refType from user where registrationTime>=1451606400 LIMIT 1')
cursor.fetchall()`
[(bytearray(b'16697627@an'), 'adx_Facebook.IE_an_ph_u8_-.cc-ch.gf.au-ret7.cr-cys.dt-all.csd-291215.-')
SQL データベースの列のデータ型は、最初の列 (uid) が "Varchar(32)"、2 番目の列 (refType) が "Varchar(128)" です。