如何更改数据库,表,列的排序规则?

use*_*469 183 mysql collation

数据库latin1_general_ci现在,我想将排序更改为utf8mb4_general_ci.

PhpMyAdmin中是否有任何设置可以更改数据库,表,列的排序规则?而不是一个一个地改变?

Qua*_*noi 240

您需要单独转换每个表:

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 
Run Code Online (Sandbox Code Playgroud)

(这也将转换列),或者导出数据库latin1并将其导入utf8mb4.

  • 我的查询:ALTER TABLE`MYTABLE` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; [请不要再使用utf8_general_ci; - )](http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci) (45认同)
  • ALTER SCHEMA`database`默认字符集utf8 DEFAULT COLLATE utf8_general_ci; (20认同)
  • 但我想改变列的整理.这将只改变表格整理.. (13认同)
  • `@rsensan`:`CONVERT`也会改变列的整理. (7认同)
  • @stormwild:这不会影响现有表 (7认同)
  • `ALTER TABLE MYTABLE CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci`,用于正确处理大多数语言的排序顺序 (3认同)
  • 两步更新所有步骤:http://georgepavlides.info/convert-all-tables-in-a-mysql-database-to-utf8_general_ci/ (2认同)

Nab*_*med 169

OP在这里做出贡献,OP问道:

如何更改数据库,表,列的排序规则?

所选答案仅在表级别上说明.


在数据库范围内更改:

ALTER DATABASE <database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

每个表更改它:

ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

好的做法是在表级更改它,因为它也会为列更改它.特定列的更改适用于任何特定情况.

更改特定列的排序规则:

ALTER TABLE <table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

  • 这个实际上直接回答了这个问题.我需要这个,因为我的表级更改没有更新列.我稍后会调查一下; 但这是让我渡过难关的信息.谢谢. (11认同)
  • 对此最好的答案. (9认同)
  • 是的,您需要指定列类型。这是一个获取所有类型的神奇命令。使用多行编辑,您可以生成命令以立即更新所有列,从这里开始:`SELECT table_schema,table_name,column_name,COLLATION_NAME,COLUMN_TYPE FROM information_schema.columns WHERE collat​​ion_name != 'utf8_general_ci' AND table_schema not in ('information_schema', 'mysql', 'performance_schema', 'sys');` (5认同)

hka*_*era 65

你可以运行一个PHP脚本.

               <?php
                   $con = mysql_connect('localhost','user','password');
                   if(!$con) { echo "Cannot connect to the database ";die();}
                   mysql_select_db('dbname');
                   $result=mysql_query('show tables');
                   while($tables = mysql_fetch_array($result)) {
                            foreach ($tables as $key => $value) {
                             mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
                       }}
                   echo "The collation of your database has been successfully changed!";
                ?>
Run Code Online (Sandbox Code Playgroud)


jee*_*eva 38

要单独更改表的排序规则,您可以使用,

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8
Run Code Online (Sandbox Code Playgroud)

要为整个数据库设置默认排序规则,

ALTER DATABASE  `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
Run Code Online (Sandbox Code Playgroud)

要不然,

转到PhpMyAdmin->操作 - >整理.

在那里,您可以找到包含所有现有排序规则的选择框.所以在这里你可以改变你的整理.因此,在创建新列时,数据库表将跟随此排序规则.创建新列时无需选择排序规则.


Sel*_*Sel 18

生成查询来更新每个表和每个表的列。我之前曾在我的一些项目中使用过它,并且能够解决我的大部分排序问题。(特别是在 JOINS 上)

要使用,只需将结果导出到分隔文本(可能是新行“\n”)

每桌

SELECT CONCAT('ALTER TABLE `', TABLE_NAME, 
              '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') 
       AS 'USE `DATABASE_NAME`;' 
FROM   INFORMATION_SCHEMA.TABLES 
WHERE  TABLE_SCHEMA = 'DATABASE_NAME' 
       AND TABLE_TYPE LIKE 'BASE TABLE' 
Run Code Online (Sandbox Code Playgroud)

每列

SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` MODIFY COLUMN `', COLUMN_NAME,'` ', 
              DATA_TYPE, IF(CHARACTER_MAXIMUM_LENGTH IS NULL 
       OR DATA_TYPE LIKE 'longtext', '', CONCAT('(', CHARACTER_MAXIMUM_LENGTH, 
                                         ')') 
       ), ' COLLATE utf8mb4_unicode_ci ', IF(INFORMATION_SCHEMA.COLUMNS.IS_NULLABLE = 'YES', 'DEFAULT NULL;', 'NOT NULL;')) AS 'USE `DATABASE_NAME`;' 
FROM   INFORMATION_SCHEMA.COLUMNS 
WHERE  TABLE_SCHEMA = 'DATABASE_NAME' 
       AND (SELECT INFORMATION_SCHEMA.TABLES.TABLE_TYPE 
            FROM   INFORMATION_SCHEMA.TABLES 
            WHERE  INFORMATION_SCHEMA.TABLES.TABLE_SCHEMA = 
                   INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA 
                   AND INFORMATION_SCHEMA.TABLES.TABLE_NAME = 
                       INFORMATION_SCHEMA.COLUMNS.TABLE_NAME 
            LIMIT  1) LIKE 'BASE TABLE' 
       AND DATA_TYPE IN ( 'char', 'varchar' ) /* include other types if necessary */
Run Code Online (Sandbox Code Playgroud)

  • 请记住,“每列”脚本不考虑“非空”约束,并且生成的行会将以前的非空列更改为可为空。 (3认同)
  • 为我工作。如果这会导致约束错误,您可以使用“SETforeign_key_checks = 0;”,只需在数据库更新后使用“SETforeign_key_checks = 1;”将其重新打开即可。 (2认同)

Par*_*oni 12

以下查询将生成ALTER查询,这些查询将所有表中所有适当列的排序规则更改为某种类型(在下面的示例中为utf8_general_ci).

SELECT concat
        (
            'ALTER TABLE ', 
                t1.TABLE_SCHEMA, 
                '.', 
                t1.table_name, 
                ' MODIFY ', 
                t1.column_name, 
                ' ', 
                t1.data_type, 
                '(' , 
                    CHARACTER_MAXIMUM_LENGTH, 
                ')', 
                ' CHARACTER SET utf8 COLLATE utf8_general_ci;'
        )
from 
    information_schema.columns t1
where 
    t1.TABLE_SCHEMA like 'you_db_name_goes_here' AND
    t1.COLLATION_NAME IS NOT NULL AND
    t1.COLLATION_NAME NOT IN ('utf8_general_ci');
Run Code Online (Sandbox Code Playgroud)

  • +1 我最喜欢这个答案。并不是每个人都神奇地拥有 PHP。有些使用其他语言与 MySQL。这很容易在 MySQL Workbench 中运行,复制行并粘贴。我只是做了额外的步骤来运行上面的 `information_schema.tables` 和 concat `ALTER TABLE 'schema'.'table' CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_bin ;` 中的代码 (2认同)
  • 并且您将失去 NULLable 和 DEFAULT 选项。 (2认同)

Yev*_*yev 10

如果你运行phpMyAdmin >> select database >> select table >>转到"操作"选项卡>>在"表格选项"部分>>你可以从下拉列表中选择整理>>,然后按下{Go}在屏幕顶部,您将看到一条消息:

您的SQL查询已成功执行

和一个脚本

ALTER TABLE `tableName` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci 
Run Code Online (Sandbox Code Playgroud)

但它不会改变现有列的排序规则.为此,您可以使用此脚本(此脚本也来自phpMyAdmin)

ALTER TABLE  `tableName` CHANGE  `Name`  `Name` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
Run Code Online (Sandbox Code Playgroud)


and*_*bd1 9

您可以在以下几个级别设置默认排序规则:

http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html

1)客户端2)服务器默认3)数据库默认4)表默认5)列


Dzi*_*ars 8

只需运行此 SQL 即可一次转换所有数据库表。将您的 COLLATION 和 databaseName 更改为您需要的内容。

SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME," COLLATE utf8_general_ci;") AS    ExecuteTheString
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="databaseName"
AND TABLE_TYPE="BASE TABLE";
Run Code Online (Sandbox Code Playgroud)


小智 8

通过 SQL 请求生成 SQL 脚本的更好变体。它不会破坏默认值/空值。

SELECT concat
    (
        'ALTER TABLE ', 
            t1.TABLE_SCHEMA, 
            '.', 
            t1.table_name, 
            ' MODIFY ', 
            t1.column_name, 
            ' ', 
            t1.column_type,
            ' CHARACTER SET utf8 COLLATE utf8_general_ci',
            if(t1.is_nullable='YES', ' NULL', ' NOT NULL'),
            if(t1.column_default is not null, concat(' DEFAULT \'', t1.column_default, '\''), ''),
            ';'
    )
from 
    information_schema.columns t1
where 
    t1.TABLE_SCHEMA like 'your_table_here' AND
    t1.COLLATION_NAME IS NOT NULL AND
    t1.COLLATION_NAME NOT IN ('utf8_general_ci');
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以通过 PHP 脚本更改所有表的 CHARSET 和 COLLATION,如下所示。我喜欢 hkasera 的答案,但问题是查询在每个表上运行两次。除了使用 MySqli 而不是 mysql 以及防止重复查询之外,此代码几乎相同。如果我可以投票的话,我会投票赞成 hkasera 的答案。

<?php
$conn1=new MySQLi("localhost","user","password","database");
if($conn1->connect_errno){
    echo mysqli_connect_error();
    exit;
}
$res=$conn1->query("show tables") or die($conn1->error);
while($tables=$res->fetch_array()){
    $conn1->query("ALTER TABLE $tables[0] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci") or die($conn1->error);
}
echo "The collation of your database has been successfully changed!";

$res->free();
$conn1->close();

?>
Run Code Online (Sandbox Code Playgroud)