• oooooooooooooooo


    安装后打开mysqld配置项
    加入skip-grant-tables
    可以无密码登录,登录进去后修改密码
    修改成功删除skip-grant-tables


    mysql> select user, plugin from mysql.user;
    +-----------+-----------------------+
    | user | plugin |
    +-----------+-----------------------+
    | root | auth_socket


    mysql> update mysql.user set authentication_string=PASSWORD('newPwd'), plugin='mysql_native_password' where user='root';


    sudo apt-get install mysql-server
    sudo service mysql status
    sudo service mysql stop/start/restart


    user表登陆密码加密方式
    mysql 8.0 修改了加密的插件方式,导致很多旧版本的navicat无法正常访问。为了方便访问,淡定创建一个原来加密方式的账号。
    plugin修改为mysql_native_password
    在我们用root访问时,需要注意老版本访问不了,所以修改plugin为老版本加密方式。

    127.0.0.1和localhost 会匹配localhost
    真实ip 匹配%

    user表详解
    https://blog.csdn.net/resilient/article/details/80796448


    mysql增加用户
    insert into user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject) values("%", "kk", password("123456"), "", "","");

    flush privileges;


    修改用户权限
    GRANT 权限 ON 数据库.* TO 用户名@'登录主机' IDENTIFIED BY '密码'
    *.* 表示所有库的所有表
    mylove.* 表示mylove库的所有表
    mylove.loves 表示mylove库的loves表


    设置编码为utf-8

    在[client]下面加上: 客户端配置 mysql.cnf
    default-character-set=utf8mb4


    在[mysqld]下面加上: 服务端配置 mysqld.cnf
    collation-server = utf8mb4_unicode_ci
    character-set-server = utf8mb4
    bind-address = 0.0.0.0

    在[mysql]下添加: 这是为了啥?
    default-character-set=utf8mb4

    重启服务器:
    service mysql restart

    show variables like 'character_set_%'

    MySQLdb连接时候指定编码,指定自动提交
    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    conv 参数 用于将返回的数据如何转换为python类型字段

    from MySQLdb.constants import FIELD_TYPE
    my_conv = { FIELD_TYPE.LONG: int }

    FIELD_TYPE.LONG: 字段使用int函数转换,其他类似。

    _mysql 的一些方法
    ping 断开重连 mysqldb貌似不行,需要自己try 出错重新连接
    query 执行
    select_db 切换数据库
    store_result 获取所有数据到client端,数据过大建议使用limit
    use_result 一个一个从server端获取, 占用server连接,并且占用connection的通道
    别人执行会覆盖数据
    commit
    rollback
    set_character_set
    get_character_set_info

    fetch_row(maxrows, how) 最多获取多少行
    how=1 default 返回tupple
    how=2 返回字典 key冲突 加上表名 如 stu.name
    how=3 返回字典 不管冲突如何 key全部返回表名加列名

    mysqldb的一些方法

    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    c=db.cursor()
    max_price=5
    c.execute("""SELECT spam, eggs, sausage FROM breakfast
    WHERE price < %s""", (max_price,))


    """ 三引号 便于分行描写sql,易于理解
    execute 参数一 写入带%s的sql, 参数二列表形式给出具体数值


    >> c.fetchone() 获取一行结果,没有返回表明读取完毕
    (3L, 2L, 0L)

    c.fetchmany(n) 返回n行结果
    c.fetchall() 返回所有

    此结果均被conv转换过了。


    多句执行
    c.executemany(
    """INSERT INTO breakfast (name, spam, eggs, sausage, price)
    VALUES (%s, %s, %s, %s, %s)""",
    [
    ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
    ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
    ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
    ] )

    执行execute 务必加上try 保证正确执行


    # 位置参数
    cursor.execute('select * from students where id = %s', args=(10, ))

    # 关键字参数
    cursor.execute('select * from students where id = %(id)s', args={'id': 10})


    1、set autocommit = 0

    关闭当前会话中事务的自动提交,需要手动 commit 或者 rollback,相当于开启一个全局的事务。
    首次自动begin,然后commit相当于重新自动begin

    在 本地登录mysql 的的会话事务中,默认 autocommit = 1,每一次 sql 操作都被认为是一个单次的事务,被隐式提交

    2、start transaction

    挂起 autocommit 的状态,开启一个事务上下文。首先数据库会隐式提交之前的还未被提交的操作,同时开启一个新事务。挂起 autocommit 的意思是保存 autocommit 的当前状态,然后 start transaction,直到 commit or rollback 结束本次事务,再恢复之前挂起的 autocommit 的状态。

    如果 start transaction 前 autocommit = 1,则完成本次事务后 autocommit 还是 1

    如果 start transaction 前 autocommit = 0,则完成本次事务后 autocommit 还是 0,接下来的操作你仍需手动 commit 才可以提交

    何时需要使用事务。

    mysql根据配置文件会限制server接受的数据包大小。

    有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。

    当然还有其他高并发情况下,会出现插入更新失败的情况,此时必须要借助事务来保证一致性了。

    安装后打开mysqld配置项
    加入skip-grant-tables
    可以无密码登录,登录进去后修改密码
    修改成功删除skip-grant-tables


    mysql> select user, plugin from mysql.user;
    +-----------+-----------------------+
    | user | plugin |
    +-----------+-----------------------+
    | root | auth_socket


    mysql> update mysql.user set authentication_string=PASSWORD('newPwd'), plugin='mysql_native_password' where user='root';


    sudo apt-get install mysql-server
    sudo service mysql status
    sudo service mysql stop/start/restart


    user表登陆密码加密方式
    mysql 8.0 修改了加密的插件方式,导致很多旧版本的navicat无法正常访问。为了方便访问,淡定创建一个原来加密方式的账号。
    plugin修改为mysql_native_password
    在我们用root访问时,需要注意老版本访问不了,所以修改plugin为老版本加密方式。

    127.0.0.1和localhost 会匹配localhost
    真实ip 匹配%

    user表详解
    https://blog.csdn.net/resilient/article/details/80796448


    mysql增加用户
    insert into user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject) values("%", "kk", password("123456"), "", "","");

    flush privileges;


    修改用户权限
    GRANT 权限 ON 数据库.* TO 用户名@'登录主机' IDENTIFIED BY '密码'
    *.* 表示所有库的所有表
    mylove.* 表示mylove库的所有表
    mylove.loves 表示mylove库的loves表


    设置编码为utf-8

    在[client]下面加上: 客户端配置 mysql.cnf
    default-character-set=utf8mb4


    在[mysqld]下面加上: 服务端配置 mysqld.cnf
    collation-server = utf8mb4_unicode_ci
    character-set-server = utf8mb4
    bind-address = 0.0.0.0

    在[mysql]下添加: 这是为了啥?
    default-character-set=utf8mb4

    重启服务器:
    service mysql restart

    show variables like 'character_set_%'

    MySQLdb连接时候指定编码,指定自动提交
    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    conv 参数 用于将返回的数据如何转换为python类型字段

    from MySQLdb.constants import FIELD_TYPE
    my_conv = { FIELD_TYPE.LONG: int }

    FIELD_TYPE.LONG: 字段使用int函数转换,其他类似。

    _mysql 的一些方法
    ping 断开重连 mysqldb貌似不行,需要自己try 出错重新连接
    query 执行
    select_db 切换数据库
    store_result 获取所有数据到client端,数据过大建议使用limit
    use_result 一个一个从server端获取, 占用server连接,并且占用connection的通道
    别人执行会覆盖数据
    commit
    rollback
    set_character_set
    get_character_set_info

    fetch_row(maxrows, how) 最多获取多少行
    how=1 default 返回tupple
    how=2 返回字典 key冲突 加上表名 如 stu.name
    how=3 返回字典 不管冲突如何 key全部返回表名加列名

    mysqldb的一些方法

    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    c=db.cursor()
    max_price=5
    c.execute("""SELECT spam, eggs, sausage FROM breakfast
    WHERE price < %s""", (max_price,))


    """ 三引号 便于分行描写sql,易于理解
    execute 参数一 写入带%s的sql, 参数二列表形式给出具体数值


    >> c.fetchone() 获取一行结果,没有返回表明读取完毕
    (3L, 2L, 0L)

    c.fetchmany(n) 返回n行结果
    c.fetchall() 返回所有

    此结果均被conv转换过了。


    多句执行
    c.executemany(
    """INSERT INTO breakfast (name, spam, eggs, sausage, price)
    VALUES (%s, %s, %s, %s, %s)""",
    [
    ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
    ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
    ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
    ] )

    执行execute 务必加上try 保证正确执行


    # 位置参数
    cursor.execute('select * from students where id = %s', args=(10, ))

    # 关键字参数
    cursor.execute('select * from students where id = %(id)s', args={'id': 10})


    1、set autocommit = 0

    关闭当前会话中事务的自动提交,需要手动 commit 或者 rollback,相当于开启一个全局的事务。
    首次自动begin,然后commit相当于重新自动begin

    在 本地登录mysql 的的会话事务中,默认 autocommit = 1,每一次 sql 操作都被认为是一个单次的事务,被隐式提交

    2、start transaction

    挂起 autocommit 的状态,开启一个事务上下文。首先数据库会隐式提交之前的还未被提交的操作,同时开启一个新事务。挂起 autocommit 的意思是保存 autocommit 的当前状态,然后 start transaction,直到 commit or rollback 结束本次事务,再恢复之前挂起的 autocommit 的状态。

    如果 start transaction 前 autocommit = 1,则完成本次事务后 autocommit 还是 1

    如果 start transaction 前 autocommit = 0,则完成本次事务后 autocommit 还是 0,接下来的操作你仍需手动 commit 才可以提交

    何时需要使用事务。

    mysql根据配置文件会限制server接受的数据包大小。

    有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。

    当然还有其他高并发情况下,会出现插入更新失败的情况,此时必须要借助事务来保证一致性了。

    安装后打开mysqld配置项
    加入skip-grant-tables
    可以无密码登录,登录进去后修改密码
    修改成功删除skip-grant-tables


    mysql> select user, plugin from mysql.user;
    +-----------+-----------------------+
    | user | plugin |
    +-----------+-----------------------+
    | root | auth_socket


    mysql> update mysql.user set authentication_string=PASSWORD('newPwd'), plugin='mysql_native_password' where user='root';


    sudo apt-get install mysql-server
    sudo service mysql status
    sudo service mysql stop/start/restart


    user表登陆密码加密方式
    mysql 8.0 修改了加密的插件方式,导致很多旧版本的navicat无法正常访问。为了方便访问,淡定创建一个原来加密方式的账号。
    plugin修改为mysql_native_password
    在我们用root访问时,需要注意老版本访问不了,所以修改plugin为老版本加密方式。

    127.0.0.1和localhost 会匹配localhost
    真实ip 匹配%

    user表详解
    https://blog.csdn.net/resilient/article/details/80796448


    mysql增加用户
    insert into user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject) values("%", "kk", password("123456"), "", "","");

    flush privileges;


    修改用户权限
    GRANT 权限 ON 数据库.* TO 用户名@'登录主机' IDENTIFIED BY '密码'
    *.* 表示所有库的所有表
    mylove.* 表示mylove库的所有表
    mylove.loves 表示mylove库的loves表


    设置编码为utf-8

    在[client]下面加上: 客户端配置 mysql.cnf
    default-character-set=utf8mb4


    在[mysqld]下面加上: 服务端配置 mysqld.cnf
    collation-server = utf8mb4_unicode_ci
    character-set-server = utf8mb4
    bind-address = 0.0.0.0

    在[mysql]下添加: 这是为了啥?
    default-character-set=utf8mb4

    重启服务器:
    service mysql restart

    show variables like 'character_set_%'

    MySQLdb连接时候指定编码,指定自动提交
    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    conv 参数 用于将返回的数据如何转换为python类型字段

    from MySQLdb.constants import FIELD_TYPE
    my_conv = { FIELD_TYPE.LONG: int }

    FIELD_TYPE.LONG: 字段使用int函数转换,其他类似。

    _mysql 的一些方法
    ping 断开重连 mysqldb貌似不行,需要自己try 出错重新连接
    query 执行
    select_db 切换数据库
    store_result 获取所有数据到client端,数据过大建议使用limit
    use_result 一个一个从server端获取, 占用server连接,并且占用connection的通道
    别人执行会覆盖数据
    commit
    rollback
    set_character_set
    get_character_set_info

    fetch_row(maxrows, how) 最多获取多少行
    how=1 default 返回tupple
    how=2 返回字典 key冲突 加上表名 如 stu.name
    how=3 返回字典 不管冲突如何 key全部返回表名加列名

    mysqldb的一些方法

    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    c=db.cursor()
    max_price=5
    c.execute("""SELECT spam, eggs, sausage FROM breakfast
    WHERE price < %s""", (max_price,))


    """ 三引号 便于分行描写sql,易于理解
    execute 参数一 写入带%s的sql, 参数二列表形式给出具体数值


    >> c.fetchone() 获取一行结果,没有返回表明读取完毕
    (3L, 2L, 0L)

    c.fetchmany(n) 返回n行结果
    c.fetchall() 返回所有

    此结果均被conv转换过了。


    多句执行
    c.executemany(
    """INSERT INTO breakfast (name, spam, eggs, sausage, price)
    VALUES (%s, %s, %s, %s, %s)""",
    [
    ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
    ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
    ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
    ] )

    执行execute 务必加上try 保证正确执行


    # 位置参数
    cursor.execute('select * from students where id = %s', args=(10, ))

    # 关键字参数
    cursor.execute('select * from students where id = %(id)s', args={'id': 10})


    1、set autocommit = 0

    关闭当前会话中事务的自动提交,需要手动 commit 或者 rollback,相当于开启一个全局的事务。
    首次自动begin,然后commit相当于重新自动begin

    在 本地登录mysql 的的会话事务中,默认 autocommit = 1,每一次 sql 操作都被认为是一个单次的事务,被隐式提交

    2、start transaction

    挂起 autocommit 的状态,开启一个事务上下文。首先数据库会隐式提交之前的还未被提交的操作,同时开启一个新事务。挂起 autocommit 的意思是保存 autocommit 的当前状态,然后 start transaction,直到 commit or rollback 结束本次事务,再恢复之前挂起的 autocommit 的状态。

    如果 start transaction 前 autocommit = 1,则完成本次事务后 autocommit 还是 1

    如果 start transaction 前 autocommit = 0,则完成本次事务后 autocommit 还是 0,接下来的操作你仍需手动 commit 才可以提交

    何时需要使用事务。

    mysql根据配置文件会限制server接受的数据包大小。

    有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。

    当然还有其他高并发情况下,会出现插入更新失败的情况,此时必须要借助事务来保证一致性了。

    安装后打开mysqld配置项
    加入skip-grant-tables
    可以无密码登录,登录进去后修改密码
    修改成功删除skip-grant-tables


    mysql> select user, plugin from mysql.user;
    +-----------+-----------------------+
    | user | plugin |
    +-----------+-----------------------+
    | root | auth_socket


    mysql> update mysql.user set authentication_string=PASSWORD('newPwd'), plugin='mysql_native_password' where user='root';


    sudo apt-get install mysql-server
    sudo service mysql status
    sudo service mysql stop/start/restart


    user表登陆密码加密方式
    mysql 8.0 修改了加密的插件方式,导致很多旧版本的navicat无法正常访问。为了方便访问,淡定创建一个原来加密方式的账号。
    plugin修改为mysql_native_password
    在我们用root访问时,需要注意老版本访问不了,所以修改plugin为老版本加密方式。

    127.0.0.1和localhost 会匹配localhost
    真实ip 匹配%

    user表详解
    https://blog.csdn.net/resilient/article/details/80796448


    mysql增加用户
    insert into user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject) values("%", "kk", password("123456"), "", "","");

    flush privileges;


    修改用户权限
    GRANT 权限 ON 数据库.* TO 用户名@'登录主机' IDENTIFIED BY '密码'
    *.* 表示所有库的所有表
    mylove.* 表示mylove库的所有表
    mylove.loves 表示mylove库的loves表


    设置编码为utf-8

    在[client]下面加上: 客户端配置 mysql.cnf
    default-character-set=utf8mb4


    在[mysqld]下面加上: 服务端配置 mysqld.cnf
    collation-server = utf8mb4_unicode_ci
    character-set-server = utf8mb4
    bind-address = 0.0.0.0

    在[mysql]下添加: 这是为了啥?
    default-character-set=utf8mb4

    重启服务器:
    service mysql restart

    show variables like 'character_set_%'

    MySQLdb连接时候指定编码,指定自动提交
    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    conv 参数 用于将返回的数据如何转换为python类型字段

    from MySQLdb.constants import FIELD_TYPE
    my_conv = { FIELD_TYPE.LONG: int }

    FIELD_TYPE.LONG: 字段使用int函数转换,其他类似。

    _mysql 的一些方法
    ping 断开重连 mysqldb貌似不行,需要自己try 出错重新连接
    query 执行
    select_db 切换数据库
    store_result 获取所有数据到client端,数据过大建议使用limit
    use_result 一个一个从server端获取, 占用server连接,并且占用connection的通道
    别人执行会覆盖数据
    commit
    rollback
    set_character_set
    get_character_set_info

    fetch_row(maxrows, how) 最多获取多少行
    how=1 default 返回tupple
    how=2 返回字典 key冲突 加上表名 如 stu.name
    how=3 返回字典 不管冲突如何 key全部返回表名加列名

    mysqldb的一些方法

    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    c=db.cursor()
    max_price=5
    c.execute("""SELECT spam, eggs, sausage FROM breakfast
    WHERE price < %s""", (max_price,))


    """ 三引号 便于分行描写sql,易于理解
    execute 参数一 写入带%s的sql, 参数二列表形式给出具体数值


    >> c.fetchone() 获取一行结果,没有返回表明读取完毕
    (3L, 2L, 0L)

    c.fetchmany(n) 返回n行结果
    c.fetchall() 返回所有

    此结果均被conv转换过了。


    多句执行
    c.executemany(
    """INSERT INTO breakfast (name, spam, eggs, sausage, price)
    VALUES (%s, %s, %s, %s, %s)""",
    [
    ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
    ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
    ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
    ] )

    执行execute 务必加上try 保证正确执行


    # 位置参数
    cursor.execute('select * from students where id = %s', args=(10, ))

    # 关键字参数
    cursor.execute('select * from students where id = %(id)s', args={'id': 10})


    1、set autocommit = 0

    关闭当前会话中事务的自动提交,需要手动 commit 或者 rollback,相当于开启一个全局的事务。
    首次自动begin,然后commit相当于重新自动begin

    在 本地登录mysql 的的会话事务中,默认 autocommit = 1,每一次 sql 操作都被认为是一个单次的事务,被隐式提交

    2、start transaction

    挂起 autocommit 的状态,开启一个事务上下文。首先数据库会隐式提交之前的还未被提交的操作,同时开启一个新事务。挂起 autocommit 的意思是保存 autocommit 的当前状态,然后 start transaction,直到 commit or rollback 结束本次事务,再恢复之前挂起的 autocommit 的状态。

    如果 start transaction 前 autocommit = 1,则完成本次事务后 autocommit 还是 1

    如果 start transaction 前 autocommit = 0,则完成本次事务后 autocommit 还是 0,接下来的操作你仍需手动 commit 才可以提交

    何时需要使用事务。

    mysql根据配置文件会限制server接受的数据包大小。

    有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。

    当然还有其他高并发情况下,会出现插入更新失败的情况,此时必须要借助事务来保证一致性了。

    安装后打开mysqld配置项
    加入skip-grant-tables
    可以无密码登录,登录进去后修改密码
    修改成功删除skip-grant-tables


    mysql> select user, plugin from mysql.user;
    +-----------+-----------------------+
    | user | plugin |
    +-----------+-----------------------+
    | root | auth_socket


    mysql> update mysql.user set authentication_string=PASSWORD('newPwd'), plugin='mysql_native_password' where user='root';


    sudo apt-get install mysql-server
    sudo service mysql status
    sudo service mysql stop/start/restart


    user表登陆密码加密方式
    mysql 8.0 修改了加密的插件方式,导致很多旧版本的navicat无法正常访问。为了方便访问,淡定创建一个原来加密方式的账号。
    plugin修改为mysql_native_password
    在我们用root访问时,需要注意老版本访问不了,所以修改plugin为老版本加密方式。

    127.0.0.1和localhost 会匹配localhost
    真实ip 匹配%

    user表详解
    https://blog.csdn.net/resilient/article/details/80796448


    mysql增加用户
    insert into user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject) values("%", "kk", password("123456"), "", "","");

    flush privileges;


    修改用户权限
    GRANT 权限 ON 数据库.* TO 用户名@'登录主机' IDENTIFIED BY '密码'
    *.* 表示所有库的所有表
    mylove.* 表示mylove库的所有表
    mylove.loves 表示mylove库的loves表


    设置编码为utf-8

    在[client]下面加上: 客户端配置 mysql.cnf
    default-character-set=utf8mb4


    在[mysqld]下面加上: 服务端配置 mysqld.cnf
    collation-server = utf8mb4_unicode_ci
    character-set-server = utf8mb4
    bind-address = 0.0.0.0

    在[mysql]下添加: 这是为了啥?
    default-character-set=utf8mb4

    重启服务器:
    service mysql restart

    show variables like 'character_set_%'

    MySQLdb连接时候指定编码,指定自动提交
    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    conv 参数 用于将返回的数据如何转换为python类型字段

    from MySQLdb.constants import FIELD_TYPE
    my_conv = { FIELD_TYPE.LONG: int }

    FIELD_TYPE.LONG: 字段使用int函数转换,其他类似。

    _mysql 的一些方法
    ping 断开重连 mysqldb貌似不行,需要自己try 出错重新连接
    query 执行
    select_db 切换数据库
    store_result 获取所有数据到client端,数据过大建议使用limit
    use_result 一个一个从server端获取, 占用server连接,并且占用connection的通道
    别人执行会覆盖数据
    commit
    rollback
    set_character_set
    get_character_set_info

    fetch_row(maxrows, how) 最多获取多少行
    how=1 default 返回tupple
    how=2 返回字典 key冲突 加上表名 如 stu.name
    how=3 返回字典 不管冲突如何 key全部返回表名加列名

    mysqldb的一些方法

    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    c=db.cursor()
    max_price=5
    c.execute("""SELECT spam, eggs, sausage FROM breakfast
    WHERE price < %s""", (max_price,))


    """ 三引号 便于分行描写sql,易于理解
    execute 参数一 写入带%s的sql, 参数二列表形式给出具体数值


    >> c.fetchone() 获取一行结果,没有返回表明读取完毕
    (3L, 2L, 0L)

    c.fetchmany(n) 返回n行结果
    c.fetchall() 返回所有

    此结果均被conv转换过了。


    多句执行
    c.executemany(
    """INSERT INTO breakfast (name, spam, eggs, sausage, price)
    VALUES (%s, %s, %s, %s, %s)""",
    [
    ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
    ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
    ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
    ] )

    执行execute 务必加上try 保证正确执行


    # 位置参数
    cursor.execute('select * from students where id = %s', args=(10, ))

    # 关键字参数
    cursor.execute('select * from students where id = %(id)s', args={'id': 10})


    1、set autocommit = 0

    关闭当前会话中事务的自动提交,需要手动 commit 或者 rollback,相当于开启一个全局的事务。
    首次自动begin,然后commit相当于重新自动begin

    在 本地登录mysql 的的会话事务中,默认 autocommit = 1,每一次 sql 操作都被认为是一个单次的事务,被隐式提交

    2、start transaction

    挂起 autocommit 的状态,开启一个事务上下文。首先数据库会隐式提交之前的还未被提交的操作,同时开启一个新事务。挂起 autocommit 的意思是保存 autocommit 的当前状态,然后 start transaction,直到 commit or rollback 结束本次事务,再恢复之前挂起的 autocommit 的状态。

    如果 start transaction 前 autocommit = 1,则完成本次事务后 autocommit 还是 1

    如果 start transaction 前 autocommit = 0,则完成本次事务后 autocommit 还是 0,接下来的操作你仍需手动 commit 才可以提交

    何时需要使用事务。

    mysql根据配置文件会限制server接受的数据包大小。

    有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。

    当然还有其他高并发情况下,会出现插入更新失败的情况,此时必须要借助事务来保证一致性了。

    安装后打开mysqld配置项
    加入skip-grant-tables
    可以无密码登录,登录进去后修改密码
    修改成功删除skip-grant-tables


    mysql> select user, plugin from mysql.user;
    +-----------+-----------------------+
    | user | plugin |
    +-----------+-----------------------+
    | root | auth_socket


    mysql> update mysql.user set authentication_string=PASSWORD('newPwd'), plugin='mysql_native_password' where user='root';


    sudo apt-get install mysql-server
    sudo service mysql status
    sudo service mysql stop/start/restart


    user表登陆密码加密方式
    mysql 8.0 修改了加密的插件方式,导致很多旧版本的navicat无法正常访问。为了方便访问,淡定创建一个原来加密方式的账号。
    plugin修改为mysql_native_password
    在我们用root访问时,需要注意老版本访问不了,所以修改plugin为老版本加密方式。

    127.0.0.1和localhost 会匹配localhost
    真实ip 匹配%

    user表详解
    https://blog.csdn.net/resilient/article/details/80796448


    mysql增加用户
    insert into user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject) values("%", "kk", password("123456"), "", "","");

    flush privileges;


    修改用户权限
    GRANT 权限 ON 数据库.* TO 用户名@'登录主机' IDENTIFIED BY '密码'
    *.* 表示所有库的所有表
    mylove.* 表示mylove库的所有表
    mylove.loves 表示mylove库的loves表


    设置编码为utf-8

    在[client]下面加上: 客户端配置 mysql.cnf
    default-character-set=utf8mb4


    在[mysqld]下面加上: 服务端配置 mysqld.cnf
    collation-server = utf8mb4_unicode_ci
    character-set-server = utf8mb4
    bind-address = 0.0.0.0

    在[mysql]下添加: 这是为了啥?
    default-character-set=utf8mb4

    重启服务器:
    service mysql restart

    show variables like 'character_set_%'

    MySQLdb连接时候指定编码,指定自动提交
    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    conv 参数 用于将返回的数据如何转换为python类型字段

    from MySQLdb.constants import FIELD_TYPE
    my_conv = { FIELD_TYPE.LONG: int }

    FIELD_TYPE.LONG: 字段使用int函数转换,其他类似。

    _mysql 的一些方法
    ping 断开重连 mysqldb貌似不行,需要自己try 出错重新连接
    query 执行
    select_db 切换数据库
    store_result 获取所有数据到client端,数据过大建议使用limit
    use_result 一个一个从server端获取, 占用server连接,并且占用connection的通道
    别人执行会覆盖数据
    commit
    rollback
    set_character_set
    get_character_set_info

    fetch_row(maxrows, how) 最多获取多少行
    how=1 default 返回tupple
    how=2 返回字典 key冲突 加上表名 如 stu.name
    how=3 返回字典 不管冲突如何 key全部返回表名加列名

    mysqldb的一些方法

    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    c=db.cursor()
    max_price=5
    c.execute("""SELECT spam, eggs, sausage FROM breakfast
    WHERE price < %s""", (max_price,))


    """ 三引号 便于分行描写sql,易于理解
    execute 参数一 写入带%s的sql, 参数二列表形式给出具体数值


    >> c.fetchone() 获取一行结果,没有返回表明读取完毕
    (3L, 2L, 0L)

    c.fetchmany(n) 返回n行结果
    c.fetchall() 返回所有

    此结果均被conv转换过了。


    多句执行
    c.executemany(
    """INSERT INTO breakfast (name, spam, eggs, sausage, price)
    VALUES (%s, %s, %s, %s, %s)""",
    [
    ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
    ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
    ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
    ] )

    执行execute 务必加上try 保证正确执行


    # 位置参数
    cursor.execute('select * from students where id = %s', args=(10, ))

    # 关键字参数
    cursor.execute('select * from students where id = %(id)s', args={'id': 10})


    1、set autocommit = 0

    关闭当前会话中事务的自动提交,需要手动 commit 或者 rollback,相当于开启一个全局的事务。
    首次自动begin,然后commit相当于重新自动begin

    在 本地登录mysql 的的会话事务中,默认 autocommit = 1,每一次 sql 操作都被认为是一个单次的事务,被隐式提交

    2、start transaction

    挂起 autocommit 的状态,开启一个事务上下文。首先数据库会隐式提交之前的还未被提交的操作,同时开启一个新事务。挂起 autocommit 的意思是保存 autocommit 的当前状态,然后 start transaction,直到 commit or rollback 结束本次事务,再恢复之前挂起的 autocommit 的状态。

    如果 start transaction 前 autocommit = 1,则完成本次事务后 autocommit 还是 1

    如果 start transaction 前 autocommit = 0,则完成本次事务后 autocommit 还是 0,接下来的操作你仍需手动 commit 才可以提交

    何时需要使用事务。

    mysql根据配置文件会限制server接受的数据包大小。

    有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。

    当然还有其他高并发情况下,会出现插入更新失败的情况,此时必须要借助事务来保证一致性了。

    安装后打开mysqld配置项
    加入skip-grant-tables
    可以无密码登录,登录进去后修改密码
    修改成功删除skip-grant-tables


    mysql> select user, plugin from mysql.user;
    +-----------+-----------------------+
    | user | plugin |
    +-----------+-----------------------+
    | root | auth_socket


    mysql> update mysql.user set authentication_string=PASSWORD('newPwd'), plugin='mysql_native_password' where user='root';


    sudo apt-get install mysql-server
    sudo service mysql status
    sudo service mysql stop/start/restart


    user表登陆密码加密方式
    mysql 8.0 修改了加密的插件方式,导致很多旧版本的navicat无法正常访问。为了方便访问,淡定创建一个原来加密方式的账号。
    plugin修改为mysql_native_password
    在我们用root访问时,需要注意老版本访问不了,所以修改plugin为老版本加密方式。

    127.0.0.1和localhost 会匹配localhost
    真实ip 匹配%

    user表详解
    https://blog.csdn.net/resilient/article/details/80796448


    mysql增加用户
    insert into user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject) values("%", "kk", password("123456"), "", "","");

    flush privileges;


    修改用户权限
    GRANT 权限 ON 数据库.* TO 用户名@'登录主机' IDENTIFIED BY '密码'
    *.* 表示所有库的所有表
    mylove.* 表示mylove库的所有表
    mylove.loves 表示mylove库的loves表


    设置编码为utf-8

    在[client]下面加上: 客户端配置 mysql.cnf
    default-character-set=utf8mb4


    在[mysqld]下面加上: 服务端配置 mysqld.cnf
    collation-server = utf8mb4_unicode_ci
    character-set-server = utf8mb4
    bind-address = 0.0.0.0

    在[mysql]下添加: 这是为了啥?
    default-character-set=utf8mb4

    重启服务器:
    service mysql restart

    show variables like 'character_set_%'

    MySQLdb连接时候指定编码,指定自动提交
    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    conv 参数 用于将返回的数据如何转换为python类型字段

    from MySQLdb.constants import FIELD_TYPE
    my_conv = { FIELD_TYPE.LONG: int }

    FIELD_TYPE.LONG: 字段使用int函数转换,其他类似。

    _mysql 的一些方法
    ping 断开重连 mysqldb貌似不行,需要自己try 出错重新连接
    query 执行
    select_db 切换数据库
    store_result 获取所有数据到client端,数据过大建议使用limit
    use_result 一个一个从server端获取, 占用server连接,并且占用connection的通道
    别人执行会覆盖数据
    commit
    rollback
    set_character_set
    get_character_set_info

    fetch_row(maxrows, how) 最多获取多少行
    how=1 default 返回tupple
    how=2 返回字典 key冲突 加上表名 如 stu.name
    how=3 返回字典 不管冲突如何 key全部返回表名加列名

    mysqldb的一些方法

    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    c=db.cursor()
    max_price=5
    c.execute("""SELECT spam, eggs, sausage FROM breakfast
    WHERE price < %s""", (max_price,))


    """ 三引号 便于分行描写sql,易于理解
    execute 参数一 写入带%s的sql, 参数二列表形式给出具体数值


    >> c.fetchone() 获取一行结果,没有返回表明读取完毕
    (3L, 2L, 0L)

    c.fetchmany(n) 返回n行结果
    c.fetchall() 返回所有

    此结果均被conv转换过了。


    多句执行
    c.executemany(
    """INSERT INTO breakfast (name, spam, eggs, sausage, price)
    VALUES (%s, %s, %s, %s, %s)""",
    [
    ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
    ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
    ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
    ] )

    执行execute 务必加上try 保证正确执行


    # 位置参数
    cursor.execute('select * from students where id = %s', args=(10, ))

    # 关键字参数
    cursor.execute('select * from students where id = %(id)s', args={'id': 10})


    1、set autocommit = 0

    关闭当前会话中事务的自动提交,需要手动 commit 或者 rollback,相当于开启一个全局的事务。
    首次自动begin,然后commit相当于重新自动begin

    在 本地登录mysql 的的会话事务中,默认 autocommit = 1,每一次 sql 操作都被认为是一个单次的事务,被隐式提交

    2、start transaction

    挂起 autocommit 的状态,开启一个事务上下文。首先数据库会隐式提交之前的还未被提交的操作,同时开启一个新事务。挂起 autocommit 的意思是保存 autocommit 的当前状态,然后 start transaction,直到 commit or rollback 结束本次事务,再恢复之前挂起的 autocommit 的状态。

    如果 start transaction 前 autocommit = 1,则完成本次事务后 autocommit 还是 1

    如果 start transaction 前 autocommit = 0,则完成本次事务后 autocommit 还是 0,接下来的操作你仍需手动 commit 才可以提交

    何时需要使用事务。

    mysql根据配置文件会限制server接受的数据包大小。

    有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。

    当然还有其他高并发情况下,会出现插入更新失败的情况,此时必须要借助事务来保证一致性了。

    安装后打开mysqld配置项
    加入skip-grant-tables
    可以无密码登录,登录进去后修改密码
    修改成功删除skip-grant-tables


    mysql> select user, plugin from mysql.user;
    +-----------+-----------------------+
    | user | plugin |
    +-----------+-----------------------+
    | root | auth_socket


    mysql> update mysql.user set authentication_string=PASSWORD('newPwd'), plugin='mysql_native_password' where user='root';


    sudo apt-get install mysql-server
    sudo service mysql status
    sudo service mysql stop/start/restart


    user表登陆密码加密方式
    mysql 8.0 修改了加密的插件方式,导致很多旧版本的navicat无法正常访问。为了方便访问,淡定创建一个原来加密方式的账号。
    plugin修改为mysql_native_password
    在我们用root访问时,需要注意老版本访问不了,所以修改plugin为老版本加密方式。

    127.0.0.1和localhost 会匹配localhost
    真实ip 匹配%

    user表详解
    https://blog.csdn.net/resilient/article/details/80796448


    mysql增加用户
    insert into user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject) values("%", "kk", password("123456"), "", "","");

    flush privileges;


    修改用户权限
    GRANT 权限 ON 数据库.* TO 用户名@'登录主机' IDENTIFIED BY '密码'
    *.* 表示所有库的所有表
    mylove.* 表示mylove库的所有表
    mylove.loves 表示mylove库的loves表


    设置编码为utf-8

    在[client]下面加上: 客户端配置 mysql.cnf
    default-character-set=utf8mb4


    在[mysqld]下面加上: 服务端配置 mysqld.cnf
    collation-server = utf8mb4_unicode_ci
    character-set-server = utf8mb4
    bind-address = 0.0.0.0

    在[mysql]下添加: 这是为了啥?
    default-character-set=utf8mb4

    重启服务器:
    service mysql restart

    show variables like 'character_set_%'

    MySQLdb连接时候指定编码,指定自动提交
    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    conv 参数 用于将返回的数据如何转换为python类型字段

    from MySQLdb.constants import FIELD_TYPE
    my_conv = { FIELD_TYPE.LONG: int }

    FIELD_TYPE.LONG: 字段使用int函数转换,其他类似。

    _mysql 的一些方法
    ping 断开重连 mysqldb貌似不行,需要自己try 出错重新连接
    query 执行
    select_db 切换数据库
    store_result 获取所有数据到client端,数据过大建议使用limit
    use_result 一个一个从server端获取, 占用server连接,并且占用connection的通道
    别人执行会覆盖数据
    commit
    rollback
    set_character_set
    get_character_set_info

    fetch_row(maxrows, how) 最多获取多少行
    how=1 default 返回tupple
    how=2 返回字典 key冲突 加上表名 如 stu.name
    how=3 返回字典 不管冲突如何 key全部返回表名加列名

    mysqldb的一些方法

    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    c=db.cursor()
    max_price=5
    c.execute("""SELECT spam, eggs, sausage FROM breakfast
    WHERE price < %s""", (max_price,))


    """ 三引号 便于分行描写sql,易于理解
    execute 参数一 写入带%s的sql, 参数二列表形式给出具体数值


    >> c.fetchone() 获取一行结果,没有返回表明读取完毕
    (3L, 2L, 0L)

    c.fetchmany(n) 返回n行结果
    c.fetchall() 返回所有

    此结果均被conv转换过了。


    多句执行
    c.executemany(
    """INSERT INTO breakfast (name, spam, eggs, sausage, price)
    VALUES (%s, %s, %s, %s, %s)""",
    [
    ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
    ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
    ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
    ] )

    执行execute 务必加上try 保证正确执行


    # 位置参数
    cursor.execute('select * from students where id = %s', args=(10, ))

    # 关键字参数
    cursor.execute('select * from students where id = %(id)s', args={'id': 10})


    1、set autocommit = 0

    关闭当前会话中事务的自动提交,需要手动 commit 或者 rollback,相当于开启一个全局的事务。
    首次自动begin,然后commit相当于重新自动begin

    在 本地登录mysql 的的会话事务中,默认 autocommit = 1,每一次 sql 操作都被认为是一个单次的事务,被隐式提交

    2、start transaction

    挂起 autocommit 的状态,开启一个事务上下文。首先数据库会隐式提交之前的还未被提交的操作,同时开启一个新事务。挂起 autocommit 的意思是保存 autocommit 的当前状态,然后 start transaction,直到 commit or rollback 结束本次事务,再恢复之前挂起的 autocommit 的状态。

    如果 start transaction 前 autocommit = 1,则完成本次事务后 autocommit 还是 1

    如果 start transaction 前 autocommit = 0,则完成本次事务后 autocommit 还是 0,接下来的操作你仍需手动 commit 才可以提交

    何时需要使用事务。

    mysql根据配置文件会限制server接受的数据包大小。

    有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。

    当然还有其他高并发情况下,会出现插入更新失败的情况,此时必须要借助事务来保证一致性了。

    安装后打开mysqld配置项
    加入skip-grant-tables
    可以无密码登录,登录进去后修改密码
    修改成功删除skip-grant-tables


    mysql> select user, plugin from mysql.user;
    +-----------+-----------------------+
    | user | plugin |
    +-----------+-----------------------+
    | root | auth_socket


    mysql> update mysql.user set authentication_string=PASSWORD('newPwd'), plugin='mysql_native_password' where user='root';


    sudo apt-get install mysql-server
    sudo service mysql status
    sudo service mysql stop/start/restart


    user表登陆密码加密方式
    mysql 8.0 修改了加密的插件方式,导致很多旧版本的navicat无法正常访问。为了方便访问,淡定创建一个原来加密方式的账号。
    plugin修改为mysql_native_password
    在我们用root访问时,需要注意老版本访问不了,所以修改plugin为老版本加密方式。

    127.0.0.1和localhost 会匹配localhost
    真实ip 匹配%

    user表详解
    https://blog.csdn.net/resilient/article/details/80796448


    mysql增加用户
    insert into user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject) values("%", "kk", password("123456"), "", "","");

    flush privileges;


    修改用户权限
    GRANT 权限 ON 数据库.* TO 用户名@'登录主机' IDENTIFIED BY '密码'
    *.* 表示所有库的所有表
    mylove.* 表示mylove库的所有表
    mylove.loves 表示mylove库的loves表


    设置编码为utf-8

    在[client]下面加上: 客户端配置 mysql.cnf
    default-character-set=utf8mb4


    在[mysqld]下面加上: 服务端配置 mysqld.cnf
    collation-server = utf8mb4_unicode_ci
    character-set-server = utf8mb4
    bind-address = 0.0.0.0

    在[mysql]下添加: 这是为了啥?
    default-character-set=utf8mb4

    重启服务器:
    service mysql restart

    show variables like 'character_set_%'

    MySQLdb连接时候指定编码,指定自动提交
    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    conv 参数 用于将返回的数据如何转换为python类型字段

    from MySQLdb.constants import FIELD_TYPE
    my_conv = { FIELD_TYPE.LONG: int }

    FIELD_TYPE.LONG: 字段使用int函数转换,其他类似。

    _mysql 的一些方法
    ping 断开重连 mysqldb貌似不行,需要自己try 出错重新连接
    query 执行
    select_db 切换数据库
    store_result 获取所有数据到client端,数据过大建议使用limit
    use_result 一个一个从server端获取, 占用server连接,并且占用connection的通道
    别人执行会覆盖数据
    commit
    rollback
    set_character_set
    get_character_set_info

    fetch_row(maxrows, how) 最多获取多少行
    how=1 default 返回tupple
    how=2 返回字典 key冲突 加上表名 如 stu.name
    how=3 返回字典 不管冲突如何 key全部返回表名加列名

    mysqldb的一些方法

    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    c=db.cursor()
    max_price=5
    c.execute("""SELECT spam, eggs, sausage FROM breakfast
    WHERE price < %s""", (max_price,))


    """ 三引号 便于分行描写sql,易于理解
    execute 参数一 写入带%s的sql, 参数二列表形式给出具体数值


    >> c.fetchone() 获取一行结果,没有返回表明读取完毕
    (3L, 2L, 0L)

    c.fetchmany(n) 返回n行结果
    c.fetchall() 返回所有

    此结果均被conv转换过了。


    多句执行
    c.executemany(
    """INSERT INTO breakfast (name, spam, eggs, sausage, price)
    VALUES (%s, %s, %s, %s, %s)""",
    [
    ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
    ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
    ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
    ] )

    执行execute 务必加上try 保证正确执行


    # 位置参数
    cursor.execute('select * from students where id = %s', args=(10, ))

    # 关键字参数
    cursor.execute('select * from students where id = %(id)s', args={'id': 10})


    1、set autocommit = 0

    关闭当前会话中事务的自动提交,需要手动 commit 或者 rollback,相当于开启一个全局的事务。
    首次自动begin,然后commit相当于重新自动begin

    在 本地登录mysql 的的会话事务中,默认 autocommit = 1,每一次 sql 操作都被认为是一个单次的事务,被隐式提交

    2、start transaction

    挂起 autocommit 的状态,开启一个事务上下文。首先数据库会隐式提交之前的还未被提交的操作,同时开启一个新事务。挂起 autocommit 的意思是保存 autocommit 的当前状态,然后 start transaction,直到 commit or rollback 结束本次事务,再恢复之前挂起的 autocommit 的状态。

    如果 start transaction 前 autocommit = 1,则完成本次事务后 autocommit 还是 1

    如果 start transaction 前 autocommit = 0,则完成本次事务后 autocommit 还是 0,接下来的操作你仍需手动 commit 才可以提交

    何时需要使用事务。

    mysql根据配置文件会限制server接受的数据包大小。

    有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。

    当然还有其他高并发情况下,会出现插入更新失败的情况,此时必须要借助事务来保证一致性了。

    安装后打开mysqld配置项
    加入skip-grant-tables
    可以无密码登录,登录进去后修改密码
    修改成功删除skip-grant-tables


    mysql> select user, plugin from mysql.user;
    +-----------+-----------------------+
    | user | plugin |
    +-----------+-----------------------+
    | root | auth_socket


    mysql> update mysql.user set authentication_string=PASSWORD('newPwd'), plugin='mysql_native_password' where user='root';


    sudo apt-get install mysql-server
    sudo service mysql status
    sudo service mysql stop/start/restart


    user表登陆密码加密方式
    mysql 8.0 修改了加密的插件方式,导致很多旧版本的navicat无法正常访问。为了方便访问,淡定创建一个原来加密方式的账号。
    plugin修改为mysql_native_password
    在我们用root访问时,需要注意老版本访问不了,所以修改plugin为老版本加密方式。

    127.0.0.1和localhost 会匹配localhost
    真实ip 匹配%

    user表详解
    https://blog.csdn.net/resilient/article/details/80796448


    mysql增加用户
    insert into user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject) values("%", "kk", password("123456"), "", "","");

    flush privileges;


    修改用户权限
    GRANT 权限 ON 数据库.* TO 用户名@'登录主机' IDENTIFIED BY '密码'
    *.* 表示所有库的所有表
    mylove.* 表示mylove库的所有表
    mylove.loves 表示mylove库的loves表


    设置编码为utf-8

    在[client]下面加上: 客户端配置 mysql.cnf
    default-character-set=utf8mb4


    在[mysqld]下面加上: 服务端配置 mysqld.cnf
    collation-server = utf8mb4_unicode_ci
    character-set-server = utf8mb4
    bind-address = 0.0.0.0

    在[mysql]下添加: 这是为了啥?
    default-character-set=utf8mb4

    重启服务器:
    service mysql restart

    show variables like 'character_set_%'

    MySQLdb连接时候指定编码,指定自动提交
    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    conv 参数 用于将返回的数据如何转换为python类型字段

    from MySQLdb.constants import FIELD_TYPE
    my_conv = { FIELD_TYPE.LONG: int }

    FIELD_TYPE.LONG: 字段使用int函数转换,其他类似。

    _mysql 的一些方法
    ping 断开重连 mysqldb貌似不行,需要自己try 出错重新连接
    query 执行
    select_db 切换数据库
    store_result 获取所有数据到client端,数据过大建议使用limit
    use_result 一个一个从server端获取, 占用server连接,并且占用connection的通道
    别人执行会覆盖数据
    commit
    rollback
    set_character_set
    get_character_set_info

    fetch_row(maxrows, how) 最多获取多少行
    how=1 default 返回tupple
    how=2 返回字典 key冲突 加上表名 如 stu.name
    how=3 返回字典 不管冲突如何 key全部返回表名加列名

    mysqldb的一些方法

    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    c=db.cursor()
    max_price=5
    c.execute("""SELECT spam, eggs, sausage FROM breakfast
    WHERE price < %s""", (max_price,))


    """ 三引号 便于分行描写sql,易于理解
    execute 参数一 写入带%s的sql, 参数二列表形式给出具体数值


    >> c.fetchone() 获取一行结果,没有返回表明读取完毕
    (3L, 2L, 0L)

    c.fetchmany(n) 返回n行结果
    c.fetchall() 返回所有

    此结果均被conv转换过了。


    多句执行
    c.executemany(
    """INSERT INTO breakfast (name, spam, eggs, sausage, price)
    VALUES (%s, %s, %s, %s, %s)""",
    [
    ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
    ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
    ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
    ] )

    执行execute 务必加上try 保证正确执行


    # 位置参数
    cursor.execute('select * from students where id = %s', args=(10, ))

    # 关键字参数
    cursor.execute('select * from students where id = %(id)s', args={'id': 10})


    1、set autocommit = 0

    关闭当前会话中事务的自动提交,需要手动 commit 或者 rollback,相当于开启一个全局的事务。
    首次自动begin,然后commit相当于重新自动begin

    在 本地登录mysql 的的会话事务中,默认 autocommit = 1,每一次 sql 操作都被认为是一个单次的事务,被隐式提交

    2、start transaction

    挂起 autocommit 的状态,开启一个事务上下文。首先数据库会隐式提交之前的还未被提交的操作,同时开启一个新事务。挂起 autocommit 的意思是保存 autocommit 的当前状态,然后 start transaction,直到 commit or rollback 结束本次事务,再恢复之前挂起的 autocommit 的状态。

    如果 start transaction 前 autocommit = 1,则完成本次事务后 autocommit 还是 1

    如果 start transaction 前 autocommit = 0,则完成本次事务后 autocommit 还是 0,接下来的操作你仍需手动 commit 才可以提交

    何时需要使用事务。

    mysql根据配置文件会限制server接受的数据包大小。

    有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。

    当然还有其他高并发情况下,会出现插入更新失败的情况,此时必须要借助事务来保证一致性了。

    安装后打开mysqld配置项
    加入skip-grant-tables
    可以无密码登录,登录进去后修改密码
    修改成功删除skip-grant-tables


    mysql> select user, plugin from mysql.user;
    +-----------+-----------------------+
    | user | plugin |
    +-----------+-----------------------+
    | root | auth_socket


    mysql> update mysql.user set authentication_string=PASSWORD('newPwd'), plugin='mysql_native_password' where user='root';


    sudo apt-get install mysql-server
    sudo service mysql status
    sudo service mysql stop/start/restart


    user表登陆密码加密方式
    mysql 8.0 修改了加密的插件方式,导致很多旧版本的navicat无法正常访问。为了方便访问,淡定创建一个原来加密方式的账号。
    plugin修改为mysql_native_password
    在我们用root访问时,需要注意老版本访问不了,所以修改plugin为老版本加密方式。

    127.0.0.1和localhost 会匹配localhost
    真实ip 匹配%

    user表详解
    https://blog.csdn.net/resilient/article/details/80796448


    mysql增加用户
    insert into user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject) values("%", "kk", password("123456"), "", "","");

    flush privileges;


    修改用户权限
    GRANT 权限 ON 数据库.* TO 用户名@'登录主机' IDENTIFIED BY '密码'
    *.* 表示所有库的所有表
    mylove.* 表示mylove库的所有表
    mylove.loves 表示mylove库的loves表


    设置编码为utf-8

    在[client]下面加上: 客户端配置 mysql.cnf
    default-character-set=utf8mb4


    在[mysqld]下面加上: 服务端配置 mysqld.cnf
    collation-server = utf8mb4_unicode_ci
    character-set-server = utf8mb4
    bind-address = 0.0.0.0

    在[mysql]下添加: 这是为了啥?
    default-character-set=utf8mb4

    重启服务器:
    service mysql restart

    show variables like 'character_set_%'

    MySQLdb连接时候指定编码,指定自动提交
    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    conv 参数 用于将返回的数据如何转换为python类型字段

    from MySQLdb.constants import FIELD_TYPE
    my_conv = { FIELD_TYPE.LONG: int }

    FIELD_TYPE.LONG: 字段使用int函数转换,其他类似。

    _mysql 的一些方法
    ping 断开重连 mysqldb貌似不行,需要自己try 出错重新连接
    query 执行
    select_db 切换数据库
    store_result 获取所有数据到client端,数据过大建议使用limit
    use_result 一个一个从server端获取, 占用server连接,并且占用connection的通道
    别人执行会覆盖数据
    commit
    rollback
    set_character_set
    get_character_set_info

    fetch_row(maxrows, how) 最多获取多少行
    how=1 default 返回tupple
    how=2 返回字典 key冲突 加上表名 如 stu.name
    how=3 返回字典 不管冲突如何 key全部返回表名加列名

    mysqldb的一些方法

    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    c=db.cursor()
    max_price=5
    c.execute("""SELECT spam, eggs, sausage FROM breakfast
    WHERE price < %s""", (max_price,))


    """ 三引号 便于分行描写sql,易于理解
    execute 参数一 写入带%s的sql, 参数二列表形式给出具体数值


    >> c.fetchone() 获取一行结果,没有返回表明读取完毕
    (3L, 2L, 0L)

    c.fetchmany(n) 返回n行结果
    c.fetchall() 返回所有

    此结果均被conv转换过了。


    多句执行
    c.executemany(
    """INSERT INTO breakfast (name, spam, eggs, sausage, price)
    VALUES (%s, %s, %s, %s, %s)""",
    [
    ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
    ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
    ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
    ] )

    执行execute 务必加上try 保证正确执行


    # 位置参数
    cursor.execute('select * from students where id = %s', args=(10, ))

    # 关键字参数
    cursor.execute('select * from students where id = %(id)s', args={'id': 10})


    1、set autocommit = 0

    关闭当前会话中事务的自动提交,需要手动 commit 或者 rollback,相当于开启一个全局的事务。
    首次自动begin,然后commit相当于重新自动begin

    在 本地登录mysql 的的会话事务中,默认 autocommit = 1,每一次 sql 操作都被认为是一个单次的事务,被隐式提交

    2、start transaction

    挂起 autocommit 的状态,开启一个事务上下文。首先数据库会隐式提交之前的还未被提交的操作,同时开启一个新事务。挂起 autocommit 的意思是保存 autocommit 的当前状态,然后 start transaction,直到 commit or rollback 结束本次事务,再恢复之前挂起的 autocommit 的状态。

    如果 start transaction 前 autocommit = 1,则完成本次事务后 autocommit 还是 1

    如果 start transaction 前 autocommit = 0,则完成本次事务后 autocommit 还是 0,接下来的操作你仍需手动 commit 才可以提交

    何时需要使用事务。

    mysql根据配置文件会限制server接受的数据包大小。

    有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。

    当然还有其他高并发情况下,会出现插入更新失败的情况,此时必须要借助事务来保证一致性了。

    安装后打开mysqld配置项
    加入skip-grant-tables
    可以无密码登录,登录进去后修改密码
    修改成功删除skip-grant-tables


    mysql> select user, plugin from mysql.user;
    +-----------+-----------------------+
    | user | plugin |
    +-----------+-----------------------+
    | root | auth_socket


    mysql> update mysql.user set authentication_string=PASSWORD('newPwd'), plugin='mysql_native_password' where user='root';


    sudo apt-get install mysql-server
    sudo service mysql status
    sudo service mysql stop/start/restart


    user表登陆密码加密方式
    mysql 8.0 修改了加密的插件方式,导致很多旧版本的navicat无法正常访问。为了方便访问,淡定创建一个原来加密方式的账号。
    plugin修改为mysql_native_password
    在我们用root访问时,需要注意老版本访问不了,所以修改plugin为老版本加密方式。

    127.0.0.1和localhost 会匹配localhost
    真实ip 匹配%

    user表详解
    https://blog.csdn.net/resilient/article/details/80796448


    mysql增加用户
    insert into user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject) values("%", "kk", password("123456"), "", "","");

    flush privileges;


    修改用户权限
    GRANT 权限 ON 数据库.* TO 用户名@'登录主机' IDENTIFIED BY '密码'
    *.* 表示所有库的所有表
    mylove.* 表示mylove库的所有表
    mylove.loves 表示mylove库的loves表


    设置编码为utf-8

    在[client]下面加上: 客户端配置 mysql.cnf
    default-character-set=utf8mb4


    在[mysqld]下面加上: 服务端配置 mysqld.cnf
    collation-server = utf8mb4_unicode_ci
    character-set-server = utf8mb4
    bind-address = 0.0.0.0

    在[mysql]下添加: 这是为了啥?
    default-character-set=utf8mb4

    重启服务器:
    service mysql restart

    show variables like 'character_set_%'

    MySQLdb连接时候指定编码,指定自动提交
    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    conv 参数 用于将返回的数据如何转换为python类型字段

    from MySQLdb.constants import FIELD_TYPE
    my_conv = { FIELD_TYPE.LONG: int }

    FIELD_TYPE.LONG: 字段使用int函数转换,其他类似。

    _mysql 的一些方法
    ping 断开重连 mysqldb貌似不行,需要自己try 出错重新连接
    query 执行
    select_db 切换数据库
    store_result 获取所有数据到client端,数据过大建议使用limit
    use_result 一个一个从server端获取, 占用server连接,并且占用connection的通道
    别人执行会覆盖数据
    commit
    rollback
    set_character_set
    get_character_set_info

    fetch_row(maxrows, how) 最多获取多少行
    how=1 default 返回tupple
    how=2 返回字典 key冲突 加上表名 如 stu.name
    how=3 返回字典 不管冲突如何 key全部返回表名加列名

    mysqldb的一些方法

    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    c=db.cursor()
    max_price=5
    c.execute("""SELECT spam, eggs, sausage FROM breakfast
    WHERE price < %s""", (max_price,))


    """ 三引号 便于分行描写sql,易于理解
    execute 参数一 写入带%s的sql, 参数二列表形式给出具体数值


    >> c.fetchone() 获取一行结果,没有返回表明读取完毕
    (3L, 2L, 0L)

    c.fetchmany(n) 返回n行结果
    c.fetchall() 返回所有

    此结果均被conv转换过了。


    多句执行
    c.executemany(
    """INSERT INTO breakfast (name, spam, eggs, sausage, price)
    VALUES (%s, %s, %s, %s, %s)""",
    [
    ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
    ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
    ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
    ] )

    执行execute 务必加上try 保证正确执行


    # 位置参数
    cursor.execute('select * from students where id = %s', args=(10, ))

    # 关键字参数
    cursor.execute('select * from students where id = %(id)s', args={'id': 10})


    1、set autocommit = 0

    关闭当前会话中事务的自动提交,需要手动 commit 或者 rollback,相当于开启一个全局的事务。
    首次自动begin,然后commit相当于重新自动begin

    在 本地登录mysql 的的会话事务中,默认 autocommit = 1,每一次 sql 操作都被认为是一个单次的事务,被隐式提交

    2、start transaction

    挂起 autocommit 的状态,开启一个事务上下文。首先数据库会隐式提交之前的还未被提交的操作,同时开启一个新事务。挂起 autocommit 的意思是保存 autocommit 的当前状态,然后 start transaction,直到 commit or rollback 结束本次事务,再恢复之前挂起的 autocommit 的状态。

    如果 start transaction 前 autocommit = 1,则完成本次事务后 autocommit 还是 1

    如果 start transaction 前 autocommit = 0,则完成本次事务后 autocommit 还是 0,接下来的操作你仍需手动 commit 才可以提交

    何时需要使用事务。

    mysql根据配置文件会限制server接受的数据包大小。

    有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。

    当然还有其他高并发情况下,会出现插入更新失败的情况,此时必须要借助事务来保证一致性了。

    安装后打开mysqld配置项
    加入skip-grant-tables
    可以无密码登录,登录进去后修改密码
    修改成功删除skip-grant-tables


    mysql> select user, plugin from mysql.user;
    +-----------+-----------------------+
    | user | plugin |
    +-----------+-----------------------+
    | root | auth_socket


    mysql> update mysql.user set authentication_string=PASSWORD('newPwd'), plugin='mysql_native_password' where user='root';


    sudo apt-get install mysql-server
    sudo service mysql status
    sudo service mysql stop/start/restart


    user表登陆密码加密方式
    mysql 8.0 修改了加密的插件方式,导致很多旧版本的navicat无法正常访问。为了方便访问,淡定创建一个原来加密方式的账号。
    plugin修改为mysql_native_password
    在我们用root访问时,需要注意老版本访问不了,所以修改plugin为老版本加密方式。

    127.0.0.1和localhost 会匹配localhost
    真实ip 匹配%

    user表详解
    https://blog.csdn.net/resilient/article/details/80796448


    mysql增加用户
    insert into user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject) values("%", "kk", password("123456"), "", "","");

    flush privileges;


    修改用户权限
    GRANT 权限 ON 数据库.* TO 用户名@'登录主机' IDENTIFIED BY '密码'
    *.* 表示所有库的所有表
    mylove.* 表示mylove库的所有表
    mylove.loves 表示mylove库的loves表


    设置编码为utf-8

    在[client]下面加上: 客户端配置 mysql.cnf
    default-character-set=utf8mb4


    在[mysqld]下面加上: 服务端配置 mysqld.cnf
    collation-server = utf8mb4_unicode_ci
    character-set-server = utf8mb4
    bind-address = 0.0.0.0

    在[mysql]下添加: 这是为了啥?
    default-character-set=utf8mb4

    重启服务器:
    service mysql restart

    show variables like 'character_set_%'

    MySQLdb连接时候指定编码,指定自动提交
    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    conv 参数 用于将返回的数据如何转换为python类型字段

    from MySQLdb.constants import FIELD_TYPE
    my_conv = { FIELD_TYPE.LONG: int }

    FIELD_TYPE.LONG: 字段使用int函数转换,其他类似。

    _mysql 的一些方法
    ping 断开重连 mysqldb貌似不行,需要自己try 出错重新连接
    query 执行
    select_db 切换数据库
    store_result 获取所有数据到client端,数据过大建议使用limit
    use_result 一个一个从server端获取, 占用server连接,并且占用connection的通道
    别人执行会覆盖数据
    commit
    rollback
    set_character_set
    get_character_set_info

    fetch_row(maxrows, how) 最多获取多少行
    how=1 default 返回tupple
    how=2 返回字典 key冲突 加上表名 如 stu.name
    how=3 返回字典 不管冲突如何 key全部返回表名加列名

    mysqldb的一些方法

    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    c=db.cursor()
    max_price=5
    c.execute("""SELECT spam, eggs, sausage FROM breakfast
    WHERE price < %s""", (max_price,))


    """ 三引号 便于分行描写sql,易于理解
    execute 参数一 写入带%s的sql, 参数二列表形式给出具体数值


    >> c.fetchone() 获取一行结果,没有返回表明读取完毕
    (3L, 2L, 0L)

    c.fetchmany(n) 返回n行结果
    c.fetchall() 返回所有

    此结果均被conv转换过了。


    多句执行
    c.executemany(
    """INSERT INTO breakfast (name, spam, eggs, sausage, price)
    VALUES (%s, %s, %s, %s, %s)""",
    [
    ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
    ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
    ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
    ] )

    执行execute 务必加上try 保证正确执行


    # 位置参数
    cursor.execute('select * from students where id = %s', args=(10, ))

    # 关键字参数
    cursor.execute('select * from students where id = %(id)s', args={'id': 10})


    1、set autocommit = 0

    关闭当前会话中事务的自动提交,需要手动 commit 或者 rollback,相当于开启一个全局的事务。
    首次自动begin,然后commit相当于重新自动begin

    在 本地登录mysql 的的会话事务中,默认 autocommit = 1,每一次 sql 操作都被认为是一个单次的事务,被隐式提交

    2、start transaction

    挂起 autocommit 的状态,开启一个事务上下文。首先数据库会隐式提交之前的还未被提交的操作,同时开启一个新事务。挂起 autocommit 的意思是保存 autocommit 的当前状态,然后 start transaction,直到 commit or rollback 结束本次事务,再恢复之前挂起的 autocommit 的状态。

    如果 start transaction 前 autocommit = 1,则完成本次事务后 autocommit 还是 1

    如果 start transaction 前 autocommit = 0,则完成本次事务后 autocommit 还是 0,接下来的操作你仍需手动 commit 才可以提交

    何时需要使用事务。

    mysql根据配置文件会限制server接受的数据包大小。

    有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。

    当然还有其他高并发情况下,会出现插入更新失败的情况,此时必须要借助事务来保证一致性了。

    安装后打开mysqld配置项
    加入skip-grant-tables
    可以无密码登录,登录进去后修改密码
    修改成功删除skip-grant-tables


    mysql> select user, plugin from mysql.user;
    +-----------+-----------------------+
    | user | plugin |
    +-----------+-----------------------+
    | root | auth_socket


    mysql> update mysql.user set authentication_string=PASSWORD('newPwd'), plugin='mysql_native_password' where user='root';


    sudo apt-get install mysql-server
    sudo service mysql status
    sudo service mysql stop/start/restart


    user表登陆密码加密方式
    mysql 8.0 修改了加密的插件方式,导致很多旧版本的navicat无法正常访问。为了方便访问,淡定创建一个原来加密方式的账号。
    plugin修改为mysql_native_password
    在我们用root访问时,需要注意老版本访问不了,所以修改plugin为老版本加密方式。

    127.0.0.1和localhost 会匹配localhost
    真实ip 匹配%

    user表详解
    https://blog.csdn.net/resilient/article/details/80796448


    mysql增加用户
    insert into user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject) values("%", "kk", password("123456"), "", "","");

    flush privileges;


    修改用户权限
    GRANT 权限 ON 数据库.* TO 用户名@'登录主机' IDENTIFIED BY '密码'
    *.* 表示所有库的所有表
    mylove.* 表示mylove库的所有表
    mylove.loves 表示mylove库的loves表


    设置编码为utf-8

    在[client]下面加上: 客户端配置 mysql.cnf
    default-character-set=utf8mb4


    在[mysqld]下面加上: 服务端配置 mysqld.cnf
    collation-server = utf8mb4_unicode_ci
    character-set-server = utf8mb4
    bind-address = 0.0.0.0

    在[mysql]下添加: 这是为了啥?
    default-character-set=utf8mb4

    重启服务器:
    service mysql restart

    show variables like 'character_set_%'

    MySQLdb连接时候指定编码,指定自动提交
    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    conv 参数 用于将返回的数据如何转换为python类型字段

    from MySQLdb.constants import FIELD_TYPE
    my_conv = { FIELD_TYPE.LONG: int }

    FIELD_TYPE.LONG: 字段使用int函数转换,其他类似。

    _mysql 的一些方法
    ping 断开重连 mysqldb貌似不行,需要自己try 出错重新连接
    query 执行
    select_db 切换数据库
    store_result 获取所有数据到client端,数据过大建议使用limit
    use_result 一个一个从server端获取, 占用server连接,并且占用connection的通道
    别人执行会覆盖数据
    commit
    rollback
    set_character_set
    get_character_set_info

    fetch_row(maxrows, how) 最多获取多少行
    how=1 default 返回tupple
    how=2 返回字典 key冲突 加上表名 如 stu.name
    how=3 返回字典 不管冲突如何 key全部返回表名加列名

    mysqldb的一些方法

    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    c=db.cursor()
    max_price=5
    c.execute("""SELECT spam, eggs, sausage FROM breakfast
    WHERE price < %s""", (max_price,))


    """ 三引号 便于分行描写sql,易于理解
    execute 参数一 写入带%s的sql, 参数二列表形式给出具体数值


    >> c.fetchone() 获取一行结果,没有返回表明读取完毕
    (3L, 2L, 0L)

    c.fetchmany(n) 返回n行结果
    c.fetchall() 返回所有

    此结果均被conv转换过了。


    多句执行
    c.executemany(
    """INSERT INTO breakfast (name, spam, eggs, sausage, price)
    VALUES (%s, %s, %s, %s, %s)""",
    [
    ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
    ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
    ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
    ] )

    执行execute 务必加上try 保证正确执行


    # 位置参数
    cursor.execute('select * from students where id = %s', args=(10, ))

    # 关键字参数
    cursor.execute('select * from students where id = %(id)s', args={'id': 10})


    1、set autocommit = 0

    关闭当前会话中事务的自动提交,需要手动 commit 或者 rollback,相当于开启一个全局的事务。
    首次自动begin,然后commit相当于重新自动begin

    在 本地登录mysql 的的会话事务中,默认 autocommit = 1,每一次 sql 操作都被认为是一个单次的事务,被隐式提交

    2、start transaction

    挂起 autocommit 的状态,开启一个事务上下文。首先数据库会隐式提交之前的还未被提交的操作,同时开启一个新事务。挂起 autocommit 的意思是保存 autocommit 的当前状态,然后 start transaction,直到 commit or rollback 结束本次事务,再恢复之前挂起的 autocommit 的状态。

    如果 start transaction 前 autocommit = 1,则完成本次事务后 autocommit 还是 1

    如果 start transaction 前 autocommit = 0,则完成本次事务后 autocommit 还是 0,接下来的操作你仍需手动 commit 才可以提交

    何时需要使用事务。

    mysql根据配置文件会限制server接受的数据包大小。

    有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。

    当然还有其他高并发情况下,会出现插入更新失败的情况,此时必须要借助事务来保证一致性了。

    安装后打开mysqld配置项
    加入skip-grant-tables
    可以无密码登录,登录进去后修改密码
    修改成功删除skip-grant-tables


    mysql> select user, plugin from mysql.user;
    +-----------+-----------------------+
    | user | plugin |
    +-----------+-----------------------+
    | root | auth_socket


    mysql> update mysql.user set authentication_string=PASSWORD('newPwd'), plugin='mysql_native_password' where user='root';


    sudo apt-get install mysql-server
    sudo service mysql status
    sudo service mysql stop/start/restart


    user表登陆密码加密方式
    mysql 8.0 修改了加密的插件方式,导致很多旧版本的navicat无法正常访问。为了方便访问,淡定创建一个原来加密方式的账号。
    plugin修改为mysql_native_password
    在我们用root访问时,需要注意老版本访问不了,所以修改plugin为老版本加密方式。

    127.0.0.1和localhost 会匹配localhost
    真实ip 匹配%

    user表详解
    https://blog.csdn.net/resilient/article/details/80796448


    mysql增加用户
    insert into user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject) values("%", "kk", password("123456"), "", "","");

    flush privileges;


    修改用户权限
    GRANT 权限 ON 数据库.* TO 用户名@'登录主机' IDENTIFIED BY '密码'
    *.* 表示所有库的所有表
    mylove.* 表示mylove库的所有表
    mylove.loves 表示mylove库的loves表


    设置编码为utf-8

    在[client]下面加上: 客户端配置 mysql.cnf
    default-character-set=utf8mb4


    在[mysqld]下面加上: 服务端配置 mysqld.cnf
    collation-server = utf8mb4_unicode_ci
    character-set-server = utf8mb4
    bind-address = 0.0.0.0

    在[mysql]下添加: 这是为了啥?
    default-character-set=utf8mb4

    重启服务器:
    service mysql restart

    show variables like 'character_set_%'

    MySQLdb连接时候指定编码,指定自动提交
    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    conv 参数 用于将返回的数据如何转换为python类型字段

    from MySQLdb.constants import FIELD_TYPE
    my_conv = { FIELD_TYPE.LONG: int }

    FIELD_TYPE.LONG: 字段使用int函数转换,其他类似。

    _mysql 的一些方法
    ping 断开重连 mysqldb貌似不行,需要自己try 出错重新连接
    query 执行
    select_db 切换数据库
    store_result 获取所有数据到client端,数据过大建议使用limit
    use_result 一个一个从server端获取, 占用server连接,并且占用connection的通道
    别人执行会覆盖数据
    commit
    rollback
    set_character_set
    get_character_set_info

    fetch_row(maxrows, how) 最多获取多少行
    how=1 default 返回tupple
    how=2 返回字典 key冲突 加上表名 如 stu.name
    how=3 返回字典 不管冲突如何 key全部返回表名加列名

    mysqldb的一些方法

    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    c=db.cursor()
    max_price=5
    c.execute("""SELECT spam, eggs, sausage FROM breakfast
    WHERE price < %s""", (max_price,))


    """ 三引号 便于分行描写sql,易于理解
    execute 参数一 写入带%s的sql, 参数二列表形式给出具体数值


    >> c.fetchone() 获取一行结果,没有返回表明读取完毕
    (3L, 2L, 0L)

    c.fetchmany(n) 返回n行结果
    c.fetchall() 返回所有

    此结果均被conv转换过了。


    多句执行
    c.executemany(
    """INSERT INTO breakfast (name, spam, eggs, sausage, price)
    VALUES (%s, %s, %s, %s, %s)""",
    [
    ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
    ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
    ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
    ] )

    执行execute 务必加上try 保证正确执行


    # 位置参数
    cursor.execute('select * from students where id = %s', args=(10, ))

    # 关键字参数
    cursor.execute('select * from students where id = %(id)s', args={'id': 10})


    1、set autocommit = 0

    关闭当前会话中事务的自动提交,需要手动 commit 或者 rollback,相当于开启一个全局的事务。
    首次自动begin,然后commit相当于重新自动begin

    在 本地登录mysql 的的会话事务中,默认 autocommit = 1,每一次 sql 操作都被认为是一个单次的事务,被隐式提交

    2、start transaction

    挂起 autocommit 的状态,开启一个事务上下文。首先数据库会隐式提交之前的还未被提交的操作,同时开启一个新事务。挂起 autocommit 的意思是保存 autocommit 的当前状态,然后 start transaction,直到 commit or rollback 结束本次事务,再恢复之前挂起的 autocommit 的状态。

    如果 start transaction 前 autocommit = 1,则完成本次事务后 autocommit 还是 1

    如果 start transaction 前 autocommit = 0,则完成本次事务后 autocommit 还是 0,接下来的操作你仍需手动 commit 才可以提交

    何时需要使用事务。

    mysql根据配置文件会限制server接受的数据包大小。

    有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。

    当然还有其他高并发情况下,会出现插入更新失败的情况,此时必须要借助事务来保证一致性了。

    安装后打开mysqld配置项
    加入skip-grant-tables
    可以无密码登录,登录进去后修改密码
    修改成功删除skip-grant-tables


    mysql> select user, plugin from mysql.user;
    +-----------+-----------------------+
    | user | plugin |
    +-----------+-----------------------+
    | root | auth_socket


    mysql> update mysql.user set authentication_string=PASSWORD('newPwd'), plugin='mysql_native_password' where user='root';


    sudo apt-get install mysql-server
    sudo service mysql status
    sudo service mysql stop/start/restart


    user表登陆密码加密方式
    mysql 8.0 修改了加密的插件方式,导致很多旧版本的navicat无法正常访问。为了方便访问,淡定创建一个原来加密方式的账号。
    plugin修改为mysql_native_password
    在我们用root访问时,需要注意老版本访问不了,所以修改plugin为老版本加密方式。

    127.0.0.1和localhost 会匹配localhost
    真实ip 匹配%

    user表详解
    https://blog.csdn.net/resilient/article/details/80796448


    mysql增加用户
    insert into user(host, user, authentication_string, ssl_cipher, x509_issuer, x509_subject) values("%", "kk", password("123456"), "", "","");

    flush privileges;


    修改用户权限
    GRANT 权限 ON 数据库.* TO 用户名@'登录主机' IDENTIFIED BY '密码'
    *.* 表示所有库的所有表
    mylove.* 表示mylove库的所有表
    mylove.loves 表示mylove库的loves表


    设置编码为utf-8

    在[client]下面加上: 客户端配置 mysql.cnf
    default-character-set=utf8mb4


    在[mysqld]下面加上: 服务端配置 mysqld.cnf
    collation-server = utf8mb4_unicode_ci
    character-set-server = utf8mb4
    bind-address = 0.0.0.0

    在[mysql]下添加: 这是为了啥?
    default-character-set=utf8mb4

    重启服务器:
    service mysql restart

    show variables like 'character_set_%'

    MySQLdb连接时候指定编码,指定自动提交
    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    conv 参数 用于将返回的数据如何转换为python类型字段

    from MySQLdb.constants import FIELD_TYPE
    my_conv = { FIELD_TYPE.LONG: int }

    FIELD_TYPE.LONG: 字段使用int函数转换,其他类似。

    _mysql 的一些方法
    ping 断开重连 mysqldb貌似不行,需要自己try 出错重新连接
    query 执行
    select_db 切换数据库
    store_result 获取所有数据到client端,数据过大建议使用limit
    use_result 一个一个从server端获取, 占用server连接,并且占用connection的通道
    别人执行会覆盖数据
    commit
    rollback
    set_character_set
    get_character_set_info

    fetch_row(maxrows, how) 最多获取多少行
    how=1 default 返回tupple
    how=2 返回字典 key冲突 加上表名 如 stu.name
    how=3 返回字典 不管冲突如何 key全部返回表名加列名

    mysqldb的一些方法

    c = db.connect(host=host, user="kk", passwd="123456", db="test", charset="utf8", autocommit=True)

    c=db.cursor()
    max_price=5
    c.execute("""SELECT spam, eggs, sausage FROM breakfast
    WHERE price < %s""", (max_price,))


    """ 三引号 便于分行描写sql,易于理解
    execute 参数一 写入带%s的sql, 参数二列表形式给出具体数值


    >> c.fetchone() 获取一行结果,没有返回表明读取完毕
    (3L, 2L, 0L)

    c.fetchmany(n) 返回n行结果
    c.fetchall() 返回所有

    此结果均被conv转换过了。


    多句执行
    c.executemany(
    """INSERT INTO breakfast (name, spam, eggs, sausage, price)
    VALUES (%s, %s, %s, %s, %s)""",
    [
    ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
    ("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
    ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
    ] )

    执行execute 务必加上try 保证正确执行


    # 位置参数
    cursor.execute('select * from students where id = %s', args=(10, ))

    # 关键字参数
    cursor.execute('select * from students where id = %(id)s', args={'id': 10})


    1、set autocommit = 0

    关闭当前会话中事务的自动提交,需要手动 commit 或者 rollback,相当于开启一个全局的事务。
    首次自动begin,然后commit相当于重新自动begin

    在 本地登录mysql 的的会话事务中,默认 autocommit = 1,每一次 sql 操作都被认为是一个单次的事务,被隐式提交

    2、start transaction

    挂起 autocommit 的状态,开启一个事务上下文。首先数据库会隐式提交之前的还未被提交的操作,同时开启一个新事务。挂起 autocommit 的意思是保存 autocommit 的当前状态,然后 start transaction,直到 commit or rollback 结束本次事务,再恢复之前挂起的 autocommit 的状态。

    如果 start transaction 前 autocommit = 1,则完成本次事务后 autocommit 还是 1

    如果 start transaction 前 autocommit = 0,则完成本次事务后 autocommit 还是 0,接下来的操作你仍需手动 commit 才可以提交

    何时需要使用事务。

    mysql根据配置文件会限制server接受的数据包大小。

    有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。

    当然还有其他高并发情况下,会出现插入更新失败的情况,此时必须要借助事务来保证一致性了。

  • 相关阅读:
    软件工程 四则运算 基于控制台。
    新学期 新气象
    http://www.cnblogs.com/091JN/
    201421123091 ONLY-JN
    201421123091 ONLY-JN
    C语言课程学习的总结
    实验13——结构体、文件的基本应用
    实验12——指针的基础应用2
    实验11——指针的基础应用
    实验十——一维数组的定义及引用
  • 原文地址:https://www.cnblogs.com/newpython/p/11783701.html
Copyright © 2020-2023  润新知