zoukankan      html  css  js  c++  java
  • 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 参数限制,导致写入或者更新失败。

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

  • 相关阅读:
    Interview with BOA
    Java Main Differences between HashMap HashTable and ConcurrentHashMap
    Java Main Differences between Java and C++
    LeetCode 33. Search in Rotated Sorted Array
    LeetCode 154. Find Minimum in Rotated Sorted Array II
    LeetCode 153. Find Minimum in Rotated Sorted Array
    LeetCode 75. Sort Colors
    LeetCode 31. Next Permutation
    LeetCode 60. Permutation Sequence
    LeetCode 216. Combination Sum III
  • 原文地址:https://www.cnblogs.com/newpython/p/11783701.html
Copyright © 2011-2022 走看看