복붙노트

[SQL] 어떻게 정렬에 데이터베이스의 모든 테이블을 변환하는?

SQL

어떻게 정렬에 데이터베이스의 모든 테이블을 변환하는?

나는 오류를 받고 있어요 :

나는 IMPLICIT, utf8_general_ci에 수동으로 두 테이블을 변경하지만 난 여전히 오류를 받고 있어요했습니다.

, utf8_general_ci에 모든 테이블을 변환 IMPLICIT과 함께 할 수있는 방법이 있습니까?

해결법

  1. ==============================

    1.각 테이블에 대한 ALTER TABLE 문을 실행해야합니다. 성명은이 양식을 따를 것입니다 :

    각 테이블에 대한 ALTER TABLE 문을 실행해야합니다. 성명은이 양식을 따를 것입니다 :

    ALTER TABLE tbl_name
    [[DEFAULT] CHARACTER SET charset_name]
    [COLLATE collation_name]
    

    이제 다음 쿼리를 실행해야 데이터베이스의 모든 테이블을 얻을 수 있습니다 :

    SELECT * 
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA="YourDataBaseName"
    AND TABLE_TYPE="BASE TABLE";
    

    그래서 지금 MySQL은 당신을 위해 코드를 작성할 수 :

    SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME," COLLATE your_collation_name_here;") AS    ExecuteTheString
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA="YourDatabaseName"
    AND TABLE_TYPE="BASE TABLE";
    

    당신은 결과를 복사하여 실행할 수 있습니다. 나는 구문을 테스트하지 않은하지만 당신은 나머지를 알아낼 수 있어야합니다. 약간의 운동이라고 생각.

    희망이 도움이!

  2. ==============================

    2.더 나은 옵션은 표 안에 또한 VARCHAR 컬럼의 데이터 정렬을 변경하려면

    더 나은 옵션은 표 안에 또한 VARCHAR 컬럼의 데이터 정렬을 변경하려면

    SELECT CONCAT('ALTER TABLE `', TABLE_NAME,'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') AS    mySQL
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA= "myschema"
    AND TABLE_TYPE="BASE TABLE"
    

    당신은 출시 무리 스크립트 사용하기 전에 비 UTF8 열에 외래 키와 데이터를 추가하는 경우

    SET foreign_key_checks = 0;
    

    그것은 글로벌 SQL은 MySQL을위한 것을 의미합니다 :

    SET foreign_key_checks = 0;
    ALTER TABLE `table1` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    ALTER TABLE `table2` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    ALTER TABLE `tableXXX` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    SET foreign_key_checks = 1;
    

    그러나 돌봐 경우에 따라 MySQL의 문서 http://dev.mysql.com/doc/refman/5.1/en/charset-column.html,

    편집 : 특별히 열 유형 열거로, 그냥 completly 충돌 세트를 열거 (특별한 caracters가없는 경우에도) https://bugs.mysql.com/bug.php?id=26731

  3. ==============================

    3.@ Namphibian의 제안은 나에게 많은 도움이 ... 하지만 조금 더 가서 스크립트에 열 및 뷰를 추가

    @ Namphibian의 제안은 나에게 많은 도움이 ... 하지만 조금 더 가서 스크립트에 열 및 뷰를 추가

    바로 아래에 스키마의 이름을 입력하고 나머지를 할 것입니다

    -- set your table name here
    SET @MY_SCHEMA = "";
    
    -- tables
    SELECT DISTINCT
        CONCAT("ALTER TABLE ", TABLE_NAME," CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") as queries
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA=@MY_SCHEMA
      AND TABLE_TYPE="BASE TABLE"
    
    UNION
    
    -- table columns
    SELECT DISTINCT
        CONCAT("ALTER TABLE ", C.TABLE_NAME, " CHANGE ", C.COLUMN_NAME, " ", C.COLUMN_NAME, " ", C.COLUMN_TYPE, " CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") as queries
    FROM INFORMATION_SCHEMA.COLUMNS as C
        LEFT JOIN INFORMATION_SCHEMA.TABLES as T
            ON C.TABLE_NAME = T.TABLE_NAME
    WHERE C.COLLATION_NAME is not null
        AND C.TABLE_SCHEMA=@MY_SCHEMA
        AND T.TABLE_TYPE="BASE TABLE"
    
    UNION
    
    -- views
    SELECT DISTINCT
        CONCAT("CREATE OR REPLACE VIEW ", V.TABLE_NAME, " AS ", V.VIEW_DEFINITION, ";") as queries
    FROM INFORMATION_SCHEMA.VIEWS as V
        LEFT JOIN INFORMATION_SCHEMA.TABLES as T
            ON V.TABLE_NAME = T.TABLE_NAME
    WHERE V.TABLE_SCHEMA=@MY_SCHEMA
        AND T.TABLE_TYPE="VIEW";
    
  4. ==============================

    4.다음은보다 정확한 쿼리입니다. 나는 UTF8로 변환하는 방법을 예제를 제공하고있다

    다음은보다 정확한 쿼리입니다. 나는 UTF8로 변환하는 방법을 예제를 제공하고있다

    SELECT CONCAT("ALTER TABLE `", TABLE_NAME,"` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;") AS    mySQL
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA="myschema"
    AND TABLE_TYPE="BASE TABLE"
    
  5. ==============================

    5.이 BASH 스크립트를 사용할 수 있습니다 :

    이 BASH 스크립트를 사용할 수 있습니다 :

    #!/bin/bash
    
    USER="YOUR_DATABASE_USER"
    PASSWORD="YOUR_USER_PASSWORD"
    DB_NAME="DATABASE_NAME"
    CHARACTER_SET="utf8" # your default character set
    COLLATE="utf8_general_ci" # your default collation
    
    tables=`mysql -u $USER -p$PASSWORD -e "SELECT tbl.TABLE_NAME FROM information_schema.TABLES tbl WHERE tbl.TABLE_SCHEMA = '$DB_NAME' AND tbl.TABLE_TYPE='BASE TABLE'"`
    
    for tableName in $tables; do
        if [[ "$tableName" != "TABLE_NAME" ]] ; then
            mysql -u $USER -p$PASSWORD -e "ALTER TABLE $DB_NAME.$tableName DEFAULT CHARACTER SET $CHARACTER_SET COLLATE $COLLATE;"
            echo "$tableName - done"
        fi
    done
    
  6. ==============================

    6.phpMyAdmin을 위해 나는이 알아 낸 :

    phpMyAdmin을 위해 나는이 알아 낸 :

    SELECT GROUP_CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME," CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" SEPARATOR ' ') AS    OneSQLString
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA="yourtableschemaname"
    AND TABLE_TYPE="BASE TABLE"
    

    그냥 yourtableschemaname을 변경하고 괜찮아요.

  7. ==============================

    7.당신은 복사 - 붙여 넣기 bash는 스크립트를 원하는 경우 :

    당신은 복사 - 붙여 넣기 bash는 스크립트를 원하는 경우 :

    var=$(mysql -e 'SELECT CONCAT("ALTER TABLE ", TABLE_NAME," CONVERT TO CHARACTER SET utf8 COLLATE utf8_czech_ci;") AS execTabs FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA="zabbix" AND TABLE_TYPE="BASE TABLE"' -uroot -p )
    
    var+='ALTER DATABASE zabbix CHARACTER SET utf8 COLLATE utf8_general_ci;'
    
    echo $var | cut -d " " -f2- | mysql -uroot -p zabbix
    

    변경 데이터베이스 이름에 zabbix.

  8. ==============================

    8.이것은 bash는 스크립트의 내 버전입니다. 이 매개 변수로 데이터베이스 이름을 사용하고 (다른 매개 변수 또는 스크립트에 정의 된 기본 값으로 주어진) 다른 캐릭터 세트와 조합에 모든 테이블을 변환합니다.

    이것은 bash는 스크립트의 내 버전입니다. 이 매개 변수로 데이터베이스 이름을 사용하고 (다른 매개 변수 또는 스크립트에 정의 된 기본 값으로 주어진) 다른 캐릭터 세트와 조합에 모든 테이블을 변환합니다.

    #!/bin/bash
    
    # mycollate.sh <database> [<charset> <collation>]
    # changes MySQL/MariaDB charset and collation for one database - all tables and
    # all columns in all tables
    
    DB="$1"
    CHARSET="$2"
    COLL="$3"
    
    [ -n "$DB" ] || exit 1
    [ -n "$CHARSET" ] || CHARSET="utf8mb4"
    [ -n "$COLL" ] || COLL="utf8mb4_general_ci"
    
    echo $DB
    echo "ALTER DATABASE $DB CHARACTER SET $CHARSET COLLATE $COLL;" | mysql
    
    echo "USE $DB; SHOW TABLES;" | mysql -s | (
        while read TABLE; do
            echo $DB.$TABLE
            echo "ALTER TABLE $TABLE CONVERT TO CHARACTER SET $CHARSET COLLATE $COLL;" | mysql $DB
        done
    )
    
  9. ==============================

    9.비밀 변수를 추가하는 단계를 더 @Petr Stastny로부터 응답을 복용. 실제로 일반 암호와 같은보다는 인수로했다 경우 내가 선호하는 것,하지만 내가 필요로 무엇을 위해 일하고있다.

    비밀 변수를 추가하는 단계를 더 @Petr Stastny로부터 응답을 복용. 실제로 일반 암호와 같은보다는 인수로했다 경우 내가 선호하는 것,하지만 내가 필요로 무엇을 위해 일하고있다.

    #!/bin/bash
    
    # mycollate.sh <database> <password> [<charset> <collation>]
    # changes MySQL/MariaDB charset and collation for one database - all tables and
    # all columns in all tables
    
    DB="$1"
    PW="$2"
    CHARSET="$3"
    COLL="$4"
    
    [ -n "$DB" ] || exit 1
    [ -n "$PW" ]
    [ -n "$CHARSET" ] || CHARSET="utf8mb4"
    [ -n "$COLL" ] || COLL="utf8mb4_bin"
    
    PW="--password=""$PW"
    
    echo $DB
    echo "ALTER DATABASE $DB CHARACTER SET $CHARSET COLLATE $COLL;" | mysql -u root "$PW"
    
    echo "USE $DB; SHOW TABLES;" | mysql -s "$PW" | (
        while read TABLE; do
            echo $DB.$TABLE
            echo "ALTER TABLE $TABLE CONVERT TO CHARACTER SET $CHARSET COLLATE $COLL;" | mysql "$PW" $DB
        done
    )
    
    PW="pleaseEmptyMeNow"
    
  10. ==============================

    10.G H I에 이어 사용자 및 호스트 매개 변수는 원격 서버에이 작업을 수행 할 필요 넣다 추가 한

    G H I에 이어 사용자 및 호스트 매개 변수는 원격 서버에이 작업을 수행 할 필요 넣다 추가 한

        #!/bin/bash
    
        # mycollate.sh <database> <user> <password> [<host> <charset> <collation>]
        # changes MySQL/MariaDB charset and collation for one database - all tables and
        # all columns in all tables
    
        DB="$1"
        USER="$2"
        PW="$3"
        HOST="$4"
        CHARSET="$5"
        COLL="$6"
    
        [ -n "$DB" ] || exit 1
        [ -n "$USER" ] || exit 1
        [ -n "$PW" ] || exit 1
        [ -n "$HOST" ] || HOST="localhost"
        [ -n "$CHARSET" ] || CHARSET="utf8mb4"
        [ -n "$COLL" ] || COLL="utf8mb4_general_ci"
    
        PW="--password=""$PW"
        HOST="--host=""$HOST"
        USER="--user=""$USER"
    
        echo $DB
        echo "ALTER DATABASE $DB CHARACTER SET $CHARSET COLLATE $COLL;" | mysql "$HOST" "$USER" "$PW"
    
        echo "USE $DB; SHOW TABLES;" | mysql  "$HOST" "$USER" "$PW" | (
            while read TABLE; do
                echo $DB.$TABLE
                echo "ALTER TABLE $TABLE CONVERT TO CHARACTER SET $CHARSET COLLATE $COLL;" | mysql  "$HOST" "$USER" "$PW" $DB
            done
        )
    
        PW="pleaseEmptyMeNow"
    
  11. from https://stackoverflow.com/questions/10859966/how-to-convert-all-tables-in-database-to-one-collation by cc-by-sa and MIT license