[SQL] 어떻게 정렬에 데이터베이스의 모든 테이블을 변환하는?
SQL어떻게 정렬에 데이터베이스의 모든 테이블을 변환하는?
나는 오류를 받고 있어요 :
나는 IMPLICIT, utf8_general_ci에 수동으로 두 테이블을 변경하지만 난 여전히 오류를 받고 있어요했습니다.
, utf8_general_ci에 모든 테이블을 변환 IMPLICIT과 함께 할 수있는 방법이 있습니까?
해결법
-
==============================
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.더 나은 옵션은 표 안에 또한 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.@ 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.다음은보다 정확한 쿼리입니다. 나는 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.이 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.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.당신은 복사 - 붙여 넣기 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.이것은 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.비밀 변수를 추가하는 단계를 더 @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.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"
from https://stackoverflow.com/questions/10859966/how-to-convert-all-tables-in-database-to-one-collation by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 개체 'DF __ *'는 '*'컬럼에 따라 달라집니다 - 더블로 INT 변경 (0) | 2020.05.18 |
---|---|
[SQL] LINQ to SQL은이 점을 놓치지 않는다? (등 음속) ORM - 매퍼 하위 최적의 솔루션이 아닌가요? (0) | 2020.05.18 |
[SQL] 관계형 데이터베이스 및 그래프 데이터베이스의 비교 (0) | 2020.05.18 |
[SQL] 열이 비어 있지 않은 위치를 선택 MYSQL (0) | 2020.05.18 |
[SQL] 어떻게 PostgreSQL의 2 진수 곳으로 평균을 반올림? (0) | 2020.05.18 |